From 2eb0c30c113cdf688809f54dac57b84cdc4ebe47 Mon Sep 17 00:00:00 2001 From: Seth Terashima Date: Wed, 19 Jun 2024 10:59:21 -0700 Subject: [PATCH 1/2] Use enum types instead of strings for domains The `cli` package was using strings instead of enum types in its API, which is error prone. --- cmd/tesla-control/commands.go | 6 +++- pkg/cli/config.go | 60 +++++++++++++++++------------------ pkg/cli/config_test.go | 24 ++++++++++++++ pkg/protocol/domains.go | 1 + 4 files changed, 60 insertions(+), 31 deletions(-) create mode 100644 pkg/cli/config_test.go diff --git a/cmd/tesla-control/commands.go b/cmd/tesla-control/commands.go index 408f8b7..2cfb97f 100644 --- a/cmd/tesla-control/commands.go +++ b/cmd/tesla-control/commands.go @@ -34,6 +34,7 @@ type Command struct { args []Argument optional []Argument handler Handler + domain protocol.Domain } // configureAndVerifyFlags verifies that c contains all the information required to execute a command. @@ -43,6 +44,9 @@ func configureFlags(c *cli.Config, commandName string, forceBLE bool) error { return ErrUnknownCommand } c.Flags = cli.FlagBLE + if info.domain != protocol.DomainNone { + c.Domains = cli.DomainList{info.domain} + } bleWake := forceBLE && commandName == "wake" if bleWake || info.requiresAuth { // Wake commands are special. When sending a wake command over the Internet, infotainment @@ -55,7 +59,7 @@ func configureFlags(c *cli.Config, commandName string, forceBLE bool) error { // One handshake with VCSEC, one handshake with infotainment. However, if we're sending a // BLE wake command, then infotainment is (presumably) asleep, and so we should only try to // handshake with VCSEC. - c.DomainNames = []string{"VCSEC"} + c.Domains = cli.DomainList{protocol.DomainVCSEC} } if !info.requiresFleetAPI { c.Flags |= cli.FlagVIN diff --git a/pkg/cli/config.go b/pkg/cli/config.go index c7596cc..0a64ea0 100644 --- a/pkg/cli/config.go +++ b/pkg/cli/config.go @@ -67,34 +67,39 @@ import ( "github.com/99designs/keyring" ) -// domainNames is used to translate domains provided at the command line into native protocol.Domain -// values. -type domainNames []string +var DomainsByName = map[string]protocol.Domain{ + "VCSEC": protocol.DomainVCSEC, + "INFOTAINMENT": protocol.DomainInfotainment, +} -func (d *domainNames) Set(value string) error { - *d = append(*d, value) - return nil +var DomainNames = map[protocol.Domain]string{ + protocol.DomainVCSEC: "VCSEC", + protocol.DomainInfotainment: "INFOTAINMENT", } -func (d *domainNames) String() string { - return strings.Join(*d, ",") +// DomainList is used to translate domains provided at the command line into native protocol.Domain +// values. +type DomainList []protocol.Domain + +// Set updates a DomainList from a command-line argument. +func (d *DomainList) Set(value string) error { + canonicalName := strings.ToUpper(value) + if domain, ok := DomainsByName[canonicalName]; ok { + *d = append(*d, domain) + } else { + return fmt.Errorf("unknown domain '%s'", value) + } + return nil } -func (d *domainNames) ToDomains() ([]protocol.Domain, error) { - mapping := map[string]protocol.Domain{ - "VCSEC": protocol.DomainVCSEC, - "INFOTAINMENT": protocol.DomainInfotainment, - } - var domains []protocol.Domain - for _, name := range *d { - canonicalName := strings.ToUpper(name) - if domain, ok := mapping[canonicalName]; ok { - domains = append(domains, domain) - } else { - return nil, fmt.Errorf("unknown domain '%s'", name) +func (d *DomainList) String() string { + var names []string + for _, domain := range *d { + if name, ok := DomainNames[domain]; ok { + names = append(names, name) } } - return domains, nil + return strings.Join(names, ",") } // Environment variable names used are used by [Config.ReadFromEnvironment] to set common parameters. @@ -145,9 +150,9 @@ type Config struct { BackendType backendType Debug bool // Enable keyring debug messages - // DomainNames can limit a vehicle connection to relevant subsystems, which can reduce + // Domains can limit a vehicle connection to relevant subsystems, which can reduce // connection latency and avoid waking up the infotainment system unnecessarily. - DomainNames domainNames + Domains DomainList password *string sessions *cache.SessionCache @@ -183,7 +188,7 @@ func (c *Config) RegisterCommandLineFlags() { flag.StringVar(&c.CacheFilename, "session-cache", "", "Load session info cache from `file`. Defaults to $TESLA_CACHE_FILE.") flag.StringVar(&c.KeyringKeyName, "key-name", "", "System keyring `name` for private key. Defaults to $TESLA_KEY_NAME.") flag.StringVar(&c.KeyFilename, "key-file", "", "A `file` containing private key. Defaults to $TESLA_KEY_FILE.") - flag.Var(&c.DomainNames, "domain", "Domains to connect to (can be repeated; omit for all)") + flag.Var(&c.Domains, "domain", "Domains to connect to (can be repeated; omit for all)") } if c.Flags.isSet(FlagOAuth) { flag.StringVar(&c.KeyringTokenName, "token-name", "", "System keyring `name` for OAuth token. Defaults to $TESLA_TOKEN_NAME.") @@ -366,12 +371,7 @@ func (c *Config) Connect(ctx context.Context) (acct *account.Account, car *vehic } if skey != nil { log.Info("Securing connection...") - domains, err := c.DomainNames.ToDomains() - if err != nil { - return nil, nil, err - } - - if err := car.StartSession(ctx, domains); err != nil { + if err := car.StartSession(ctx, c.Domains); err != nil { return nil, nil, err } } diff --git a/pkg/cli/config_test.go b/pkg/cli/config_test.go new file mode 100644 index 0000000..ad85778 --- /dev/null +++ b/pkg/cli/config_test.go @@ -0,0 +1,24 @@ +package cli_test + +import ( + "github.com/teslamotors/vehicle-command/pkg/cli" + "testing" +) + +func TestDomainCLI(t *testing.T) { + var d cli.DomainList + if d.Set("DoesNotExist") == nil { + t.Error("Expected error when parsing invalid domain name") + } + // Uppercase + if err := d.Set("VCSEC"); err != nil { + t.Errorf("Unexpected error when parsing VCSEC: %s", err) + } + // Mixed case + if err := d.Set("infoTainMenT"); err != nil { + t.Errorf("Unexpected error when parsing mixed-case domain name: %s", err) + } + if s := d.String(); s != "VCSEC,INFOTAINMENT" { + t.Errorf("Unexpected string conversion result: %s", s) + } +} diff --git a/pkg/protocol/domains.go b/pkg/protocol/domains.go index 88598e6..aff5b86 100644 --- a/pkg/protocol/domains.go +++ b/pkg/protocol/domains.go @@ -9,6 +9,7 @@ import ( type Domain = universal.Domain const ( + DomainNone = universal.Domain_DOMAIN_BROADCAST // DomainVCSEC handles (un)lock, remote start drive, keychain management commands. DomainVCSEC = universal.Domain_DOMAIN_VEHICLE_SECURITY // DomainInfotainment handles commands that terminate on the vehicle's infotainment system. From be6b39253cfba629d815f7d422c2348b40dde49a Mon Sep 17 00:00:00 2001 From: Seth Terashima Date: Mon, 17 Jun 2024 17:14:40 -0700 Subject: [PATCH 2/2] Add body-controller-state command New command fetchs limited information about body controller states. The advantage of this command over the more comprehensive vehicle data endpoint is that it works over BLE. --- cmd/tesla-control/commands.go | 21 + go.mod | 2 +- go.sum | 8 +- pkg/protocol/protobuf/vcsec.proto | 54 + pkg/protocol/protobuf/vcsec/vcsec.pb.go | 1214 +++++++++++++++++------ pkg/vehicle/security.go | 31 +- pkg/vehicle/state.go | 16 + pkg/vehicle/vcsec.go | 25 + 8 files changed, 1038 insertions(+), 333 deletions(-) create mode 100644 pkg/vehicle/state.go diff --git a/cmd/tesla-control/commands.go b/cmd/tesla-control/commands.go index 2cfb97f..026406f 100644 --- a/cmd/tesla-control/commands.go +++ b/cmd/tesla-control/commands.go @@ -16,6 +16,7 @@ import ( "github.com/teslamotors/vehicle-command/pkg/protocol/protobuf/keys" "github.com/teslamotors/vehicle-command/pkg/protocol/protobuf/vcsec" "github.com/teslamotors/vehicle-command/pkg/vehicle" + "google.golang.org/protobuf/encoding/protojson" ) var ErrCommandLineArgs = errors.New("invalid command line arguments") @@ -798,4 +799,24 @@ var commands = map[string]*Command{ return car.CloseWindows(ctx) }, }, + "body-controller-state": &Command{ + help: "Fetch limited vehicle state information. Works over BLE when infotainment is asleep.", + domain: protocol.DomainVCSEC, + requiresAuth: false, + requiresFleetAPI: false, + handler: func(ctx context.Context, acct *account.Account, car *vehicle.Vehicle, args map[string]string) error { + info, err := car.BodyControllerState(ctx) + if err != nil { + return err + } + options := protojson.MarshalOptions{ + Indent: "\t", + UseEnumNumbers: false, + EmitUnpopulated: false, + EmitDefaultValues: true, + } + fmt.Println(options.Format(info)) + return nil + }, + }, } diff --git a/go.mod b/go.mod index 03882f2..7dad6a4 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/go-ble/ble v0.0.0-20220207185428-60d1eecf2633 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 golang.org/x/term v0.5.0 - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.34.2 ) require ( diff --git a/go.sum b/go.sum index 31337d4..e24b28c 100644 --- a/go.sum +++ b/go.sum @@ -15,8 +15,6 @@ github.com/go-ble/ble v0.0.0-20220207185428-60d1eecf2633 h1:ZrzoZQz1CF33SPHLkjRp github.com/go-ble/ble v0.0.0-20220207185428-60d1eecf2633/go.mod h1:fFJl/jD/uyILGBeD5iQ8tYHrPlJafyqCJzAyTHNJ1Uk= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= @@ -66,10 +64,8 @@ golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/protocol/protobuf/vcsec.proto b/pkg/protocol/protobuf/vcsec.proto index 17bfc5d..df24473 100644 --- a/pkg/protocol/protobuf/vcsec.proto +++ b/pkg/protocol/protobuf/vcsec.proto @@ -225,9 +225,63 @@ message UnsignedMessage { } } +enum ClosureState_E { + CLOSURESTATE_CLOSED = 0; + CLOSURESTATE_OPEN = 1; + CLOSURESTATE_AJAR = 2; + CLOSURESTATE_UNKNOWN = 3; + CLOSURESTATE_FAILED_UNLATCH = 4; + CLOSURESTATE_OPENING = 5; + CLOSURESTATE_CLOSING = 6; +} + +enum VehicleLockState_E { + VEHICLELOCKSTATE_UNLOCKED = 0; + VEHICLELOCKSTATE_LOCKED = 1; + VEHICLELOCKSTATE_INTERNAL_LOCKED = 2; + VEHICLELOCKSTATE_SELECTIVE_UNLOCKED = 3; +} + +message ClosureStatuses +{ + ClosureState_E frontDriverDoor = 1; + ClosureState_E frontPassengerDoor = 2; + ClosureState_E rearDriverDoor = 3; + ClosureState_E rearPassengerDoor = 4; + ClosureState_E rearTrunk = 5; + ClosureState_E frontTrunk = 6; + ClosureState_E chargePort = 7; + ClosureState_E tonneau = 8; +} + +enum VehicleSleepStatus_E { + VEHICLE_SLEEP_STATUS_UNKNOWN = 0; + VEHICLE_SLEEP_STATUS_AWAKE = 1; + VEHICLE_SLEEP_STATUS_ASLEEP = 2; +} + +message DetailedClosureStatus { + uint32 tonneauPercentOpen = 1; +} + +enum UserPresence_E { + VEHICLE_USER_PRESENCE_UNKNOWN = 0; + VEHICLE_USER_PRESENCE_NOT_PRESENT = 1; + VEHICLE_USER_PRESENCE_PRESENT = 2; +} + +message VehicleStatus { + ClosureStatuses closureStatuses = 1; + VehicleLockState_E vehicleLockState = 2; + VehicleSleepStatus_E vehicleSleepStatus = 3; + UserPresence_E userPresence = 4; + DetailedClosureStatus detailedClosureStatus = 5; +} + message FromVCSECMessage { reserved 6 to 10; oneof sub_message { + VehicleStatus vehicleStatus = 1; CommandStatus commandStatus = 4; WhitelistInfo whitelistInfo = 16; WhitelistEntryInfo whitelistEntryInfo = 17; diff --git a/pkg/protocol/protobuf/vcsec/vcsec.pb.go b/pkg/protocol/protobuf/vcsec/vcsec.pb.go index 607a8d4..ee15bbc 100644 --- a/pkg/protocol/protobuf/vcsec/vcsec.pb.go +++ b/pkg/protocol/protobuf/vcsec/vcsec.pb.go @@ -129,6 +129,7 @@ const ( InformationRequestType_INFORMATION_REQUEST_TYPE_GET_STATUS InformationRequestType = 0 InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_INFO InformationRequestType = 5 InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_ENTRY_INFO InformationRequestType = 6 + InformationRequestType_INFORMATION_REQUEST_TYPE_GET_VEHICLE_INFO InformationRequestType = 7 ) // Enum value maps for InformationRequestType. @@ -137,11 +138,13 @@ var ( 0: "INFORMATION_REQUEST_TYPE_GET_STATUS", 5: "INFORMATION_REQUEST_TYPE_GET_WHITELIST_INFO", 6: "INFORMATION_REQUEST_TYPE_GET_WHITELIST_ENTRY_INFO", + 7: "INFORMATION_REQUEST_TYPE_GET_VEHICLE_INFO", } InformationRequestType_value = map[string]int32{ "INFORMATION_REQUEST_TYPE_GET_STATUS": 0, "INFORMATION_REQUEST_TYPE_GET_WHITELIST_INFO": 5, "INFORMATION_REQUEST_TYPE_GET_WHITELIST_ENTRY_INFO": 6, + "INFORMATION_REQUEST_TYPE_GET_VEHICLE_INFO": 7, } ) @@ -540,6 +543,217 @@ func (WhitelistOperationInformation_E) EnumDescriptor() ([]byte, []int) { return file_vcsec_proto_rawDescGZIP(), []int{7} } +type ClosureState_E int32 + +const ( + ClosureState_E_CLOSURESTATE_CLOSED ClosureState_E = 0 + ClosureState_E_CLOSURESTATE_OPEN ClosureState_E = 1 + ClosureState_E_CLOSURESTATE_AJAR ClosureState_E = 2 + ClosureState_E_CLOSURESTATE_UNKNOWN ClosureState_E = 3 + ClosureState_E_CLOSURESTATE_FAILED_UNLATCH ClosureState_E = 4 + ClosureState_E_CLOSURESTATE_OPENING ClosureState_E = 5 + ClosureState_E_CLOSURESTATE_CLOSING ClosureState_E = 6 +) + +// Enum value maps for ClosureState_E. +var ( + ClosureState_E_name = map[int32]string{ + 0: "CLOSURESTATE_CLOSED", + 1: "CLOSURESTATE_OPEN", + 2: "CLOSURESTATE_AJAR", + 3: "CLOSURESTATE_UNKNOWN", + 4: "CLOSURESTATE_FAILED_UNLATCH", + 5: "CLOSURESTATE_OPENING", + 6: "CLOSURESTATE_CLOSING", + } + ClosureState_E_value = map[string]int32{ + "CLOSURESTATE_CLOSED": 0, + "CLOSURESTATE_OPEN": 1, + "CLOSURESTATE_AJAR": 2, + "CLOSURESTATE_UNKNOWN": 3, + "CLOSURESTATE_FAILED_UNLATCH": 4, + "CLOSURESTATE_OPENING": 5, + "CLOSURESTATE_CLOSING": 6, + } +) + +func (x ClosureState_E) Enum() *ClosureState_E { + p := new(ClosureState_E) + *p = x + return p +} + +func (x ClosureState_E) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ClosureState_E) Descriptor() protoreflect.EnumDescriptor { + return file_vcsec_proto_enumTypes[8].Descriptor() +} + +func (ClosureState_E) Type() protoreflect.EnumType { + return &file_vcsec_proto_enumTypes[8] +} + +func (x ClosureState_E) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ClosureState_E.Descriptor instead. +func (ClosureState_E) EnumDescriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{8} +} + +type VehicleLockState_E int32 + +const ( + VehicleLockState_E_VEHICLELOCKSTATE_UNLOCKED VehicleLockState_E = 0 + VehicleLockState_E_VEHICLELOCKSTATE_LOCKED VehicleLockState_E = 1 + VehicleLockState_E_VEHICLELOCKSTATE_INTERNAL_LOCKED VehicleLockState_E = 2 + VehicleLockState_E_VEHICLELOCKSTATE_SELECTIVE_UNLOCKED VehicleLockState_E = 3 +) + +// Enum value maps for VehicleLockState_E. +var ( + VehicleLockState_E_name = map[int32]string{ + 0: "VEHICLELOCKSTATE_UNLOCKED", + 1: "VEHICLELOCKSTATE_LOCKED", + 2: "VEHICLELOCKSTATE_INTERNAL_LOCKED", + 3: "VEHICLELOCKSTATE_SELECTIVE_UNLOCKED", + } + VehicleLockState_E_value = map[string]int32{ + "VEHICLELOCKSTATE_UNLOCKED": 0, + "VEHICLELOCKSTATE_LOCKED": 1, + "VEHICLELOCKSTATE_INTERNAL_LOCKED": 2, + "VEHICLELOCKSTATE_SELECTIVE_UNLOCKED": 3, + } +) + +func (x VehicleLockState_E) Enum() *VehicleLockState_E { + p := new(VehicleLockState_E) + *p = x + return p +} + +func (x VehicleLockState_E) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VehicleLockState_E) Descriptor() protoreflect.EnumDescriptor { + return file_vcsec_proto_enumTypes[9].Descriptor() +} + +func (VehicleLockState_E) Type() protoreflect.EnumType { + return &file_vcsec_proto_enumTypes[9] +} + +func (x VehicleLockState_E) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VehicleLockState_E.Descriptor instead. +func (VehicleLockState_E) EnumDescriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{9} +} + +type VehicleSleepStatus_E int32 + +const ( + VehicleSleepStatus_E_VEHICLE_SLEEP_STATUS_UNKNOWN VehicleSleepStatus_E = 0 + VehicleSleepStatus_E_VEHICLE_SLEEP_STATUS_AWAKE VehicleSleepStatus_E = 1 + VehicleSleepStatus_E_VEHICLE_SLEEP_STATUS_ASLEEP VehicleSleepStatus_E = 2 +) + +// Enum value maps for VehicleSleepStatus_E. +var ( + VehicleSleepStatus_E_name = map[int32]string{ + 0: "VEHICLE_SLEEP_STATUS_UNKNOWN", + 1: "VEHICLE_SLEEP_STATUS_AWAKE", + 2: "VEHICLE_SLEEP_STATUS_ASLEEP", + } + VehicleSleepStatus_E_value = map[string]int32{ + "VEHICLE_SLEEP_STATUS_UNKNOWN": 0, + "VEHICLE_SLEEP_STATUS_AWAKE": 1, + "VEHICLE_SLEEP_STATUS_ASLEEP": 2, + } +) + +func (x VehicleSleepStatus_E) Enum() *VehicleSleepStatus_E { + p := new(VehicleSleepStatus_E) + *p = x + return p +} + +func (x VehicleSleepStatus_E) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VehicleSleepStatus_E) Descriptor() protoreflect.EnumDescriptor { + return file_vcsec_proto_enumTypes[10].Descriptor() +} + +func (VehicleSleepStatus_E) Type() protoreflect.EnumType { + return &file_vcsec_proto_enumTypes[10] +} + +func (x VehicleSleepStatus_E) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VehicleSleepStatus_E.Descriptor instead. +func (VehicleSleepStatus_E) EnumDescriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{10} +} + +type UserPresence_E int32 + +const ( + UserPresence_E_VEHICLE_USER_PRESENCE_UNKNOWN UserPresence_E = 0 + UserPresence_E_VEHICLE_USER_PRESENCE_NOT_PRESENT UserPresence_E = 1 + UserPresence_E_VEHICLE_USER_PRESENCE_PRESENT UserPresence_E = 2 +) + +// Enum value maps for UserPresence_E. +var ( + UserPresence_E_name = map[int32]string{ + 0: "VEHICLE_USER_PRESENCE_UNKNOWN", + 1: "VEHICLE_USER_PRESENCE_NOT_PRESENT", + 2: "VEHICLE_USER_PRESENCE_PRESENT", + } + UserPresence_E_value = map[string]int32{ + "VEHICLE_USER_PRESENCE_UNKNOWN": 0, + "VEHICLE_USER_PRESENCE_NOT_PRESENT": 1, + "VEHICLE_USER_PRESENCE_PRESENT": 2, + } +) + +func (x UserPresence_E) Enum() *UserPresence_E { + p := new(UserPresence_E) + *p = x + return p +} + +func (x UserPresence_E) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (UserPresence_E) Descriptor() protoreflect.EnumDescriptor { + return file_vcsec_proto_enumTypes[11].Descriptor() +} + +func (UserPresence_E) Type() protoreflect.EnumType { + return &file_vcsec_proto_enumTypes[11] +} + +func (x UserPresence_E) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use UserPresence_E.Descriptor instead. +func (UserPresence_E) EnumDescriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{11} +} + type SignedMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1811,12 +2025,242 @@ func (*UnsignedMessage_ClosureMoveRequest) isUnsignedMessage_SubMessage() {} func (*UnsignedMessage_WhitelistOperation) isUnsignedMessage_SubMessage() {} +type ClosureStatuses struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrontDriverDoor ClosureState_E `protobuf:"varint,1,opt,name=frontDriverDoor,proto3,enum=VCSEC.ClosureState_E" json:"frontDriverDoor,omitempty"` + FrontPassengerDoor ClosureState_E `protobuf:"varint,2,opt,name=frontPassengerDoor,proto3,enum=VCSEC.ClosureState_E" json:"frontPassengerDoor,omitempty"` + RearDriverDoor ClosureState_E `protobuf:"varint,3,opt,name=rearDriverDoor,proto3,enum=VCSEC.ClosureState_E" json:"rearDriverDoor,omitempty"` + RearPassengerDoor ClosureState_E `protobuf:"varint,4,opt,name=rearPassengerDoor,proto3,enum=VCSEC.ClosureState_E" json:"rearPassengerDoor,omitempty"` + RearTrunk ClosureState_E `protobuf:"varint,5,opt,name=rearTrunk,proto3,enum=VCSEC.ClosureState_E" json:"rearTrunk,omitempty"` + FrontTrunk ClosureState_E `protobuf:"varint,6,opt,name=frontTrunk,proto3,enum=VCSEC.ClosureState_E" json:"frontTrunk,omitempty"` + ChargePort ClosureState_E `protobuf:"varint,7,opt,name=chargePort,proto3,enum=VCSEC.ClosureState_E" json:"chargePort,omitempty"` + Tonneau ClosureState_E `protobuf:"varint,8,opt,name=tonneau,proto3,enum=VCSEC.ClosureState_E" json:"tonneau,omitempty"` +} + +func (x *ClosureStatuses) Reset() { + *x = ClosureStatuses{} + if protoimpl.UnsafeEnabled { + mi := &file_vcsec_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ClosureStatuses) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClosureStatuses) ProtoMessage() {} + +func (x *ClosureStatuses) ProtoReflect() protoreflect.Message { + mi := &file_vcsec_proto_msgTypes[16] + 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 ClosureStatuses.ProtoReflect.Descriptor instead. +func (*ClosureStatuses) Descriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{16} +} + +func (x *ClosureStatuses) GetFrontDriverDoor() ClosureState_E { + if x != nil { + return x.FrontDriverDoor + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetFrontPassengerDoor() ClosureState_E { + if x != nil { + return x.FrontPassengerDoor + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetRearDriverDoor() ClosureState_E { + if x != nil { + return x.RearDriverDoor + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetRearPassengerDoor() ClosureState_E { + if x != nil { + return x.RearPassengerDoor + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetRearTrunk() ClosureState_E { + if x != nil { + return x.RearTrunk + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetFrontTrunk() ClosureState_E { + if x != nil { + return x.FrontTrunk + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetChargePort() ClosureState_E { + if x != nil { + return x.ChargePort + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +func (x *ClosureStatuses) GetTonneau() ClosureState_E { + if x != nil { + return x.Tonneau + } + return ClosureState_E_CLOSURESTATE_CLOSED +} + +type DetailedClosureStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TonneauPercentOpen uint32 `protobuf:"varint,1,opt,name=tonneauPercentOpen,proto3" json:"tonneauPercentOpen,omitempty"` +} + +func (x *DetailedClosureStatus) Reset() { + *x = DetailedClosureStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_vcsec_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetailedClosureStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetailedClosureStatus) ProtoMessage() {} + +func (x *DetailedClosureStatus) ProtoReflect() protoreflect.Message { + mi := &file_vcsec_proto_msgTypes[17] + 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 DetailedClosureStatus.ProtoReflect.Descriptor instead. +func (*DetailedClosureStatus) Descriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{17} +} + +func (x *DetailedClosureStatus) GetTonneauPercentOpen() uint32 { + if x != nil { + return x.TonneauPercentOpen + } + return 0 +} + +type VehicleStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClosureStatuses *ClosureStatuses `protobuf:"bytes,1,opt,name=closureStatuses,proto3" json:"closureStatuses,omitempty"` + VehicleLockState VehicleLockState_E `protobuf:"varint,2,opt,name=vehicleLockState,proto3,enum=VCSEC.VehicleLockState_E" json:"vehicleLockState,omitempty"` + VehicleSleepStatus VehicleSleepStatus_E `protobuf:"varint,3,opt,name=vehicleSleepStatus,proto3,enum=VCSEC.VehicleSleepStatus_E" json:"vehicleSleepStatus,omitempty"` + UserPresence UserPresence_E `protobuf:"varint,4,opt,name=userPresence,proto3,enum=VCSEC.UserPresence_E" json:"userPresence,omitempty"` + DetailedClosureStatus *DetailedClosureStatus `protobuf:"bytes,5,opt,name=detailedClosureStatus,proto3" json:"detailedClosureStatus,omitempty"` +} + +func (x *VehicleStatus) Reset() { + *x = VehicleStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_vcsec_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VehicleStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VehicleStatus) ProtoMessage() {} + +func (x *VehicleStatus) ProtoReflect() protoreflect.Message { + mi := &file_vcsec_proto_msgTypes[18] + 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 VehicleStatus.ProtoReflect.Descriptor instead. +func (*VehicleStatus) Descriptor() ([]byte, []int) { + return file_vcsec_proto_rawDescGZIP(), []int{18} +} + +func (x *VehicleStatus) GetClosureStatuses() *ClosureStatuses { + if x != nil { + return x.ClosureStatuses + } + return nil +} + +func (x *VehicleStatus) GetVehicleLockState() VehicleLockState_E { + if x != nil { + return x.VehicleLockState + } + return VehicleLockState_E_VEHICLELOCKSTATE_UNLOCKED +} + +func (x *VehicleStatus) GetVehicleSleepStatus() VehicleSleepStatus_E { + if x != nil { + return x.VehicleSleepStatus + } + return VehicleSleepStatus_E_VEHICLE_SLEEP_STATUS_UNKNOWN +} + +func (x *VehicleStatus) GetUserPresence() UserPresence_E { + if x != nil { + return x.UserPresence + } + return UserPresence_E_VEHICLE_USER_PRESENCE_UNKNOWN +} + +func (x *VehicleStatus) GetDetailedClosureStatus() *DetailedClosureStatus { + if x != nil { + return x.DetailedClosureStatus + } + return nil +} + type FromVCSECMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Types that are assignable to SubMessage: + // *FromVCSECMessage_VehicleStatus // *FromVCSECMessage_CommandStatus // *FromVCSECMessage_WhitelistInfo // *FromVCSECMessage_WhitelistEntryInfo @@ -1827,7 +2271,7 @@ type FromVCSECMessage struct { func (x *FromVCSECMessage) Reset() { *x = FromVCSECMessage{} if protoimpl.UnsafeEnabled { - mi := &file_vcsec_proto_msgTypes[16] + mi := &file_vcsec_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1840,7 +2284,7 @@ func (x *FromVCSECMessage) String() string { func (*FromVCSECMessage) ProtoMessage() {} func (x *FromVCSECMessage) ProtoReflect() protoreflect.Message { - mi := &file_vcsec_proto_msgTypes[16] + mi := &file_vcsec_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1853,7 +2297,7 @@ func (x *FromVCSECMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use FromVCSECMessage.ProtoReflect.Descriptor instead. func (*FromVCSECMessage) Descriptor() ([]byte, []int) { - return file_vcsec_proto_rawDescGZIP(), []int{16} + return file_vcsec_proto_rawDescGZIP(), []int{19} } func (m *FromVCSECMessage) GetSubMessage() isFromVCSECMessage_SubMessage { @@ -1863,6 +2307,13 @@ func (m *FromVCSECMessage) GetSubMessage() isFromVCSECMessage_SubMessage { return nil } +func (x *FromVCSECMessage) GetVehicleStatus() *VehicleStatus { + if x, ok := x.GetSubMessage().(*FromVCSECMessage_VehicleStatus); ok { + return x.VehicleStatus + } + return nil +} + func (x *FromVCSECMessage) GetCommandStatus() *CommandStatus { if x, ok := x.GetSubMessage().(*FromVCSECMessage_CommandStatus); ok { return x.CommandStatus @@ -1895,6 +2346,10 @@ type isFromVCSECMessage_SubMessage interface { isFromVCSECMessage_SubMessage() } +type FromVCSECMessage_VehicleStatus struct { + VehicleStatus *VehicleStatus `protobuf:"bytes,1,opt,name=vehicleStatus,proto3,oneof"` +} + type FromVCSECMessage_CommandStatus struct { CommandStatus *CommandStatus `protobuf:"bytes,4,opt,name=commandStatus,proto3,oneof"` } @@ -1911,6 +2366,8 @@ type FromVCSECMessage_NominalError struct { NominalError *errors.NominalError `protobuf:"bytes,46,opt,name=nominalError,proto3,oneof"` } +func (*FromVCSECMessage_VehicleStatus) isFromVCSECMessage_SubMessage() {} + func (*FromVCSECMessage_CommandStatus) isFromVCSECMessage_SubMessage() {} func (*FromVCSECMessage_WhitelistInfo) isFromVCSECMessage_SubMessage() {} @@ -2169,256 +2626,361 @@ var file_vcsec_proto_rawDesc = []byte{ 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0d, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0c, 0x10, 0x0d, 0x4a, 0x04, 0x08, - 0x0d, 0x10, 0x0e, 0x22, 0xac, 0x02, 0x0a, 0x10, 0x46, 0x72, 0x6f, 0x6d, 0x56, 0x43, 0x53, 0x45, - 0x43, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x12, 0x77, - 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x3a, 0x0a, 0x0c, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x2e, 0x4e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x0c, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x0d, 0x0a, - 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, 0x04, 0x08, 0x06, - 0x10, 0x0b, 0x2a, 0x48, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, - 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x2a, 0xad, 0x01, 0x0a, - 0x0d, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, - 0x0a, 0x17, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, - 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x4b, - 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, - 0x46, 0x43, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, 0x45, 0x59, - 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x4f, 0x53, - 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, 0x22, 0x0a, 0x1e, 0x4b, 0x45, 0x59, - 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x4e, 0x44, - 0x52, 0x4f, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x07, 0x12, 0x1d, 0x0a, - 0x19, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x09, 0x2a, 0xa9, 0x01, 0x0a, - 0x16, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x46, 0x4f, 0x52, - 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x10, 0x00, - 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x54, - 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, - 0x05, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, - 0x54, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x45, 0x4e, 0x54, 0x52, - 0x59, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x06, 0x2a, 0x97, 0x01, 0x0a, 0x0b, 0x52, 0x4b, 0x45, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x45, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x4b, 0x45, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x00, 0x12, - 0x13, 0x0a, 0x0f, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, - 0x43, 0x4b, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x44, 0x52, 0x49, 0x56, 0x45, 0x10, - 0x14, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, - 0x43, 0x4c, 0x45, 0x10, 0x1d, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x41, 0x4b, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, - 0x10, 0x1e, 0x2a, 0xa0, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x4d, 0x6f, - 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, - 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, - 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x5f, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x01, - 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x1a, 0x0a, 0x16, - 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x4f, 0x53, - 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4c, - 0x4f, 0x53, 0x45, 0x10, 0x04, 0x2a, 0x60, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x45, 0x12, 0x16, 0x0a, 0x12, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, 0x4b, - 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, - 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0xf3, 0x08, 0x0a, 0x1b, 0x53, 0x69, 0x67, 0x6e, - 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x45, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x49, 0x47, 0x4e, 0x45, - 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x55, - 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x34, 0x0a, 0x30, 0x53, 0x49, 0x47, 0x4e, + 0x0d, 0x10, 0x0e, 0x22, 0xf1, 0x03, 0x0a, 0x0f, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x12, 0x3f, 0x0a, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x0f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x12, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x44, 0x6f, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6c, 0x6f, + 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x12, 0x66, 0x72, 0x6f, + 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x44, 0x6f, 0x6f, 0x72, 0x12, + 0x3d, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x72, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, + 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x0e, + 0x72, 0x65, 0x61, 0x72, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x6f, 0x72, 0x12, 0x43, + 0x0a, 0x11, 0x72, 0x65, 0x61, 0x72, 0x50, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x44, + 0x6f, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, + 0x43, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, + 0x52, 0x11, 0x72, 0x65, 0x61, 0x72, 0x50, 0x61, 0x73, 0x73, 0x65, 0x6e, 0x67, 0x65, 0x72, 0x44, + 0x6f, 0x6f, 0x72, 0x12, 0x33, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x72, 0x54, 0x72, 0x75, 0x6e, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, + 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x09, 0x72, + 0x65, 0x61, 0x72, 0x54, 0x72, 0x75, 0x6e, 0x6b, 0x12, 0x35, 0x0a, 0x0a, 0x66, 0x72, 0x6f, 0x6e, + 0x74, 0x54, 0x72, 0x75, 0x6e, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, + 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x5f, 0x45, 0x52, 0x0a, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x54, 0x72, 0x75, 0x6e, 0x6b, 0x12, + 0x35, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6c, 0x6f, 0x73, + 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x0a, 0x63, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x74, 0x6f, 0x6e, 0x6e, 0x65, 0x61, + 0x75, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, + 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x07, + 0x74, 0x6f, 0x6e, 0x6e, 0x65, 0x61, 0x75, 0x22, 0x47, 0x0a, 0x15, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x6f, 0x6e, 0x6e, 0x65, 0x61, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x74, 0x6f, + 0x6e, 0x6e, 0x65, 0x61, 0x75, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x6e, + 0x22, 0xf4, 0x02, 0x0a, 0x0d, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x56, 0x43, + 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x65, 0x73, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x10, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, + 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, + 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f, + 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x52, 0x10, 0x76, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4b, 0x0a, 0x12, 0x76, + 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, + 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x5f, 0x45, 0x52, 0x12, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x6c, 0x65, + 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x72, + 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x45, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x15, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, + 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x15, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xea, 0x02, 0x0a, 0x10, 0x46, 0x72, 0x6f, 0x6d, + 0x56, 0x43, 0x53, 0x45, 0x43, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x0a, 0x0d, + 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x76, 0x65, 0x68, + 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x77, 0x68, 0x69, 0x74, + 0x65, 0x6c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x0d, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x4b, 0x0a, 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x56, 0x43, 0x53, 0x45, 0x43, 0x2e, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, + 0x12, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x3a, 0x0a, 0x0c, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x73, 0x2e, 0x4e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, + 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, + 0x0d, 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4a, 0x04, + 0x08, 0x06, 0x10, 0x0b, 0x2a, 0x48, 0x0a, 0x0d, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, + 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1e, + 0x0a, 0x1a, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x02, 0x2a, 0xad, + 0x01, 0x0a, 0x0d, 0x4b, 0x65, 0x79, 0x46, 0x6f, 0x72, 0x6d, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, + 0x12, 0x1b, 0x0a, 0x17, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, + 0x54, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1c, 0x0a, + 0x18, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x4e, 0x46, 0x43, 0x5f, 0x43, 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x4b, + 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, + 0x4f, 0x53, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, 0x22, 0x0a, 0x1e, 0x4b, + 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x41, + 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x10, 0x07, 0x12, + 0x1d, 0x0a, 0x19, 0x4b, 0x45, 0x59, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x46, 0x41, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x43, 0x4c, 0x4f, 0x55, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x09, 0x2a, 0xd8, + 0x01, 0x0a, 0x16, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x10, 0x00, 0x12, 0x2f, 0x0a, 0x2b, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, + 0x45, 0x54, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x46, + 0x4f, 0x10, 0x05, 0x12, 0x35, 0x0a, 0x31, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x47, 0x45, 0x54, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x45, 0x4e, + 0x54, 0x52, 0x59, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x06, 0x12, 0x2d, 0x0a, 0x29, 0x49, 0x4e, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x47, 0x45, 0x54, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, + 0x4c, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x07, 0x2a, 0x97, 0x01, 0x0a, 0x0b, 0x52, 0x4b, + 0x45, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x45, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x4b, 0x45, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, + 0x4f, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x44, 0x52, 0x49, 0x56, 0x45, + 0x10, 0x14, 0x12, 0x22, 0x0a, 0x1e, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x45, 0x5f, 0x56, 0x45, 0x48, + 0x49, 0x43, 0x4c, 0x45, 0x10, 0x1d, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x4b, 0x45, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x41, 0x4b, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, + 0x45, 0x10, 0x1e, 0x2a, 0xa0, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, 0x4d, + 0x6f, 0x76, 0x65, 0x54, 0x79, 0x70, 0x65, 0x5f, 0x45, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, + 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, + 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x10, + 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x10, 0x02, 0x12, 0x1a, 0x0a, + 0x16, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x4c, 0x4f, + 0x53, 0x55, 0x52, 0x45, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x04, 0x2a, 0x60, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x45, 0x12, 0x16, 0x0a, 0x12, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4f, + 0x4b, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x57, 0x41, 0x49, 0x54, 0x10, 0x01, 0x12, 0x19, 0x0a, + 0x15, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0xf3, 0x08, 0x0a, 0x1b, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x45, 0x12, 0x22, 0x0a, 0x1e, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, - 0x4f, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, 0x3c, - 0x0a, 0x38, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, - 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, - 0x54, 0x5f, 0x49, 0x56, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, - 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x31, 0x0a, 0x2d, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x04, 0x12, - 0x3d, 0x0a, 0x39, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x34, 0x0a, 0x30, 0x53, 0x49, 0x47, + 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, + 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x4f, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x12, + 0x3c, 0x0a, 0x38, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, - 0x4c, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x43, 0x4f, 0x55, - 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x05, 0x12, 0x34, - 0x0a, 0x30, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, - 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, - 0x54, 0x5f, 0x41, 0x45, 0x53, 0x5f, 0x44, 0x45, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x41, 0x55, - 0x54, 0x48, 0x10, 0x06, 0x12, 0x2f, 0x0a, 0x2b, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, - 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x49, 0x4e, - 0x50, 0x55, 0x54, 0x10, 0x07, 0x12, 0x33, 0x0a, 0x2f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, + 0x4c, 0x54, 0x5f, 0x49, 0x56, 0x5f, 0x53, 0x4d, 0x41, 0x4c, 0x4c, 0x45, 0x52, 0x5f, 0x54, 0x48, + 0x41, 0x4e, 0x5f, 0x45, 0x58, 0x50, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x31, 0x0a, + 0x2d, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, + 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x04, + 0x12, 0x3d, 0x0a, 0x39, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, + 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, + 0x55, 0x4c, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x43, 0x4f, + 0x55, 0x4e, 0x54, 0x45, 0x52, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x05, 0x12, + 0x34, 0x0a, 0x30, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x5f, 0x41, 0x45, 0x53, 0x5f, 0x44, 0x45, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x41, + 0x55, 0x54, 0x48, 0x10, 0x06, 0x12, 0x2f, 0x0a, 0x2b, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x53, - 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x36, 0x0a, 0x32, 0x53, 0x49, - 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, - 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, - 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x10, 0x09, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, - 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4e, 0x54, 0x49, - 0x54, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x3a, 0x0a, 0x36, 0x53, + 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, 0x49, + 0x4e, 0x50, 0x55, 0x54, 0x10, 0x07, 0x12, 0x33, 0x0a, 0x2f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, + 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x45, 0x43, 0x44, 0x53, 0x41, 0x5f, + 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x36, 0x0a, 0x32, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x43, - 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, 0x56, - 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x0b, 0x12, 0x3c, 0x0a, 0x38, 0x53, 0x49, 0x47, 0x4e, 0x45, - 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, 0x56, 0x45, 0x5f, 0x54, 0x4f, - 0x4b, 0x45, 0x4e, 0x10, 0x0c, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, - 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, 0x55, - 0x52, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x48, 0x4f, 0x52, 0x54, 0x10, 0x0d, 0x12, 0x3d, - 0x0a, 0x39, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, + 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x5f, 0x53, 0x54, 0x41, 0x52, + 0x54, 0x10, 0x09, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, + 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4e, 0x54, + 0x49, 0x54, 0x59, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x3a, 0x0a, 0x36, + 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, + 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, + 0x56, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x0b, 0x12, 0x3c, 0x0a, 0x38, 0x53, 0x49, 0x47, 0x4e, + 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4c, + 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x52, 0x45, 0x54, 0x52, 0x49, 0x45, 0x56, 0x45, 0x5f, 0x54, + 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x0c, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, + 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x49, 0x47, 0x4e, 0x41, 0x54, + 0x55, 0x52, 0x45, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x48, 0x4f, 0x52, 0x54, 0x10, 0x0d, 0x12, + 0x3d, 0x0a, 0x39, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, + 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x49, 0x4e, 0x43, 0x4f, + 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x0e, 0x12, 0x33, + 0x0a, 0x2f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, - 0x54, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x5f, 0x49, 0x53, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, - 0x52, 0x45, 0x43, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x0e, 0x12, 0x33, 0x0a, - 0x2f, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, - 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x45, 0x50, 0x4f, 0x43, 0x48, - 0x10, 0x0f, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, - 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x49, 0x56, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, - 0x43, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x10, 0x12, 0x30, 0x0a, 0x2c, 0x53, - 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x54, - 0x49, 0x4d, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x11, 0x12, 0x41, 0x0a, - 0x3d, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, - 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, - 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x10, 0x12, - 0x12, 0x3b, 0x0a, 0x37, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, - 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, - 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x48, 0x41, - 0x53, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x13, 0x2a, 0xc3, 0x0c, - 0x0a, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x45, 0x12, 0x27, 0x0a, 0x23, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x35, 0x0a, 0x31, 0x57, - 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x01, 0x12, 0x42, 0x0a, 0x3e, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x4e, 0x45, - 0x53, 0x45, 0x4c, 0x46, 0x10, 0x02, 0x12, 0x34, 0x0a, 0x30, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, - 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x46, 0x4f, 0x42, 0x5f, - 0x53, 0x4c, 0x4f, 0x54, 0x53, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x31, 0x0a, 0x2d, + 0x54, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x45, 0x50, 0x4f, 0x43, + 0x48, 0x10, 0x0f, 0x12, 0x37, 0x0a, 0x33, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, + 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x49, 0x56, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, + 0x45, 0x43, 0x54, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x10, 0x12, 0x30, 0x0a, 0x2c, + 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x49, 0x4e, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, + 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x45, 0x44, 0x10, 0x11, 0x12, 0x41, + 0x0a, 0x3d, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, + 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x55, 0x4c, + 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, + 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x49, 0x54, 0x59, 0x10, + 0x12, 0x12, 0x3b, 0x0a, 0x37, 0x53, 0x49, 0x47, 0x4e, 0x45, 0x44, 0x4d, 0x45, 0x53, 0x53, 0x41, + 0x47, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, + 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x43, 0x4f, 0x55, 0x4c, 0x44, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x48, + 0x41, 0x53, 0x48, 0x5f, 0x4d, 0x45, 0x54, 0x41, 0x44, 0x41, 0x54, 0x41, 0x10, 0x13, 0x2a, 0xc3, + 0x0c, 0x0a, 0x20, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x45, 0x12, 0x27, 0x0a, 0x23, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x35, 0x0a, 0x31, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, - 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x04, 0x12, - 0x37, 0x0a, 0x33, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x05, 0x12, 0x35, 0x0a, 0x31, 0x57, 0x48, 0x49, 0x54, - 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, - 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x06, 0x12, - 0x3a, 0x0a, 0x36, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x07, 0x12, 0x46, 0x0a, 0x42, 0x57, - 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, - 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x43, - 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x53, 0x10, 0x08, 0x12, 0x4c, 0x0a, 0x48, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, + 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, + 0x4e, 0x44, 0x4f, 0x43, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x01, 0x12, 0x42, 0x0a, 0x3e, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, - 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x4c, 0x45, 0x56, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x54, 0x48, 0x45, - 0x52, 0x5f, 0x41, 0x42, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x53, 0x45, 0x4c, 0x46, 0x10, - 0x09, 0x12, 0x4b, 0x0a, 0x47, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, - 0x4f, 0x5f, 0x44, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x49, 0x4f, - 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x4e, 0x45, 0x53, 0x45, 0x4c, 0x46, 0x10, 0x0a, 0x12, 0x47, - 0x0a, 0x43, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x52, - 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, - 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0b, 0x12, 0x3e, 0x0a, 0x3a, 0x57, 0x48, 0x49, 0x54, 0x45, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x4e, + 0x45, 0x53, 0x45, 0x4c, 0x46, 0x10, 0x02, 0x12, 0x34, 0x0a, 0x30, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, - 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x54, - 0x45, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0c, 0x12, 0x59, 0x0a, 0x55, 0x57, 0x48, 0x49, 0x54, 0x45, - 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, - 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x5f, - 0x54, 0x48, 0x41, 0x54, 0x5f, 0x49, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, 0x5f, - 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x45, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, - 0x10, 0x0d, 0x12, 0x46, 0x0a, 0x42, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, - 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x55, 0x4e, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x4f, - 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x0e, 0x12, 0x41, 0x0a, 0x3d, 0x57, 0x48, - 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4d, 0x5f, - 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x55, 0x54, 0x53, 0x49, 0x44, - 0x45, 0x5f, 0x4f, 0x46, 0x5f, 0x46, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0f, 0x12, 0x45, 0x0a, - 0x41, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x46, 0x4f, 0x42, + 0x5f, 0x53, 0x4c, 0x4f, 0x54, 0x53, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x03, 0x12, 0x31, 0x0a, + 0x2d, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x46, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, - 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x4b, - 0x45, 0x59, 0x10, 0x10, 0x12, 0x48, 0x0a, 0x44, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, - 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, - 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, - 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x50, - 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x11, 0x12, 0x39, - 0x0a, 0x35, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4b, 0x45, 0x59, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x4c, 0x45, 0x5f, - 0x46, 0x53, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x12, 0x12, 0x45, 0x0a, 0x41, 0x57, 0x48, 0x49, + 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x04, + 0x12, 0x37, 0x0a, 0x33, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x10, 0x05, 0x12, 0x35, 0x0a, 0x31, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, - 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, 0x45, - 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x13, - 0x12, 0x4a, 0x0a, 0x46, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, + 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x06, + 0x12, 0x3a, 0x0a, 0x36, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, - 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x14, 0x12, 0x51, 0x0a, 0x4d, + 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x10, 0x07, 0x12, 0x46, 0x0a, 0x42, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, + 0x4f, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x4f, 0x5f, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, + 0x4e, 0x53, 0x10, 0x08, 0x12, 0x4c, 0x0a, 0x48, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, + 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, + 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, + 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x45, 0x4c, 0x45, 0x56, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x54, 0x48, + 0x45, 0x52, 0x5f, 0x41, 0x42, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x4e, 0x45, 0x53, 0x45, 0x4c, 0x46, + 0x10, 0x09, 0x12, 0x4b, 0x0a, 0x47, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, + 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, + 0x54, 0x4f, 0x5f, 0x44, 0x45, 0x4d, 0x4f, 0x54, 0x45, 0x5f, 0x53, 0x55, 0x50, 0x45, 0x52, 0x49, + 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x5f, 0x4f, 0x4e, 0x45, 0x53, 0x45, 0x4c, 0x46, 0x10, 0x0a, 0x12, + 0x47, 0x0a, 0x43, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, + 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, + 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x0b, 0x12, 0x3e, 0x0a, 0x3a, 0x57, 0x48, 0x49, 0x54, + 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, + 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, + 0x43, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, 0x4e, 0x5f, 0x57, 0x48, 0x49, + 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0c, 0x12, 0x59, 0x0a, 0x55, 0x57, 0x48, 0x49, 0x54, + 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, + 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, + 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, 0x45, 0x59, + 0x5f, 0x54, 0x48, 0x41, 0x54, 0x5f, 0x49, 0x53, 0x5f, 0x41, 0x4c, 0x52, 0x45, 0x41, 0x44, 0x59, + 0x5f, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x45, 0x5f, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, + 0x54, 0x10, 0x0d, 0x12, 0x46, 0x0a, 0x42, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, + 0x44, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x55, 0x4e, 0x4c, 0x45, 0x53, 0x53, 0x5f, + 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x41, 0x44, 0x45, 0x52, 0x10, 0x0e, 0x12, 0x41, 0x0a, 0x3d, 0x57, + 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4d, + 0x5f, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x59, 0x49, 0x4e, 0x47, 0x5f, 0x4f, 0x55, 0x54, 0x53, 0x49, + 0x44, 0x45, 0x5f, 0x4f, 0x46, 0x5f, 0x46, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x10, 0x0f, 0x12, 0x45, + 0x0a, 0x41, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, + 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, + 0x4b, 0x45, 0x59, 0x10, 0x10, 0x12, 0x48, 0x0a, 0x44, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, + 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x4d, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, + 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, + 0x50, 0x45, 0x52, 0x4d, 0x41, 0x4e, 0x45, 0x4e, 0x54, 0x5f, 0x4b, 0x45, 0x59, 0x10, 0x11, 0x12, + 0x39, 0x0a, 0x35, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x4b, 0x45, 0x59, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x57, 0x48, 0x49, 0x4c, 0x45, + 0x5f, 0x46, 0x53, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x12, 0x12, 0x45, 0x0a, 0x41, 0x57, 0x48, + 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, + 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, + 0x45, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x4f, 0x55, 0x54, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x13, 0x12, 0x4a, 0x0a, 0x46, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, + 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, + 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x14, 0x12, 0x51, 0x0a, + 0x4d, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x4e, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, + 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, + 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x10, 0x15, + 0x12, 0x62, 0x0a, 0x5e, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x10, 0x15, 0x12, - 0x62, 0x0a, 0x5e, 0x57, 0x48, 0x49, 0x54, 0x45, 0x4c, 0x49, 0x53, 0x54, 0x4f, 0x50, 0x45, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4b, 0x45, 0x59, 0x5f, 0x41, 0x54, - 0x54, 0x45, 0x4d, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x54, 0x4f, 0x5f, 0x41, 0x44, 0x44, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x5f, 0x4f, 0x55, 0x54, - 0x53, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, 0x44, - 0x45, 0x10, 0x16, 0x42, 0x5f, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x2e, 0x74, 0x65, 0x73, 0x6c, 0x61, - 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x76, 0x63, 0x73, 0x65, 0x63, - 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x73, - 0x6c, 0x61, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, - 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, - 0x63, 0x73, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x5f, 0x4f, 0x55, + 0x54, 0x53, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x4d, 0x4f, + 0x44, 0x45, 0x10, 0x16, 0x2a, 0xc6, 0x01, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x75, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x45, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4c, 0x4f, 0x53, 0x55, + 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x01, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4c, 0x4f, 0x53, 0x55, + 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4a, 0x41, 0x52, 0x10, 0x02, 0x12, 0x18, + 0x0a, 0x14, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4c, 0x4f, 0x53, + 0x55, 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, + 0x55, 0x4e, 0x4c, 0x41, 0x54, 0x43, 0x48, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4c, 0x4f, + 0x53, 0x55, 0x52, 0x45, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4c, 0x4f, 0x53, 0x55, 0x52, 0x45, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x43, 0x4c, 0x4f, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x2a, 0x9f, 0x01, + 0x0a, 0x12, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x5f, 0x45, 0x12, 0x1d, 0x0a, 0x19, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x4c, + 0x4f, 0x43, 0x4b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x4c, 0x4f, + 0x43, 0x4b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x24, 0x0a, 0x20, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x4c, 0x4f, 0x43, 0x4b, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x4c, 0x4f, + 0x43, 0x4b, 0x45, 0x44, 0x10, 0x02, 0x12, 0x27, 0x0a, 0x23, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, + 0x45, 0x4c, 0x4f, 0x43, 0x4b, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x45, 0x4c, 0x45, 0x43, + 0x54, 0x49, 0x56, 0x45, 0x5f, 0x55, 0x4e, 0x4c, 0x4f, 0x43, 0x4b, 0x45, 0x44, 0x10, 0x03, 0x2a, + 0x79, 0x0a, 0x14, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x6c, 0x65, 0x65, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x45, 0x12, 0x20, 0x0a, 0x1c, 0x56, 0x45, 0x48, 0x49, 0x43, + 0x4c, 0x45, 0x5f, 0x53, 0x4c, 0x45, 0x45, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x56, 0x45, 0x48, + 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x53, 0x4c, 0x45, 0x45, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x41, 0x57, 0x41, 0x4b, 0x45, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x56, 0x45, 0x48, + 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x53, 0x4c, 0x45, 0x45, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x41, 0x53, 0x4c, 0x45, 0x45, 0x50, 0x10, 0x02, 0x2a, 0x7d, 0x0a, 0x0e, 0x55, 0x73, + 0x65, 0x72, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x45, 0x12, 0x21, 0x0a, 0x1d, + 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x45, + 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, + 0x25, 0x0a, 0x21, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, + 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x45, + 0x53, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x21, 0x0a, 0x1d, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, + 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x43, 0x45, 0x5f, + 0x50, 0x52, 0x45, 0x53, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x42, 0x5f, 0x0a, 0x19, 0x63, 0x6f, 0x6d, + 0x2e, 0x74, 0x65, 0x73, 0x6c, 0x61, 0x2e, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x2e, 0x76, 0x63, 0x73, 0x65, 0x63, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x74, 0x65, 0x73, 0x6c, 0x61, 0x6d, 0x6f, 0x74, 0x6f, 0x72, 0x73, 0x2f, 0x76, + 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2d, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x2f, 0x70, + 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x63, 0x73, 0x65, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -2433,8 +2995,8 @@ func file_vcsec_proto_rawDescGZIP() []byte { return file_vcsec_proto_rawDescData } -var file_vcsec_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_vcsec_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_vcsec_proto_enumTypes = make([]protoimpl.EnumInfo, 12) +var file_vcsec_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_vcsec_proto_goTypes = []interface{}{ (SignatureType)(0), // 0: VCSEC.SignatureType (KeyFormFactor)(0), // 1: VCSEC.KeyFormFactor @@ -2444,37 +3006,44 @@ var file_vcsec_proto_goTypes = []interface{}{ (OperationStatus_E)(0), // 5: VCSEC.OperationStatus_E (SignedMessageInformation_E)(0), // 6: VCSEC.SignedMessage_information_E (WhitelistOperationInformation_E)(0), // 7: VCSEC.WhitelistOperation_information_E - (*SignedMessage)(nil), // 8: VCSEC.SignedMessage - (*ToVCSECMessage)(nil), // 9: VCSEC.ToVCSECMessage - (*KeyIdentifier)(nil), // 10: VCSEC.KeyIdentifier - (*KeyMetadata)(nil), // 11: VCSEC.KeyMetadata - (*PublicKey)(nil), // 12: VCSEC.PublicKey - (*WhitelistInfo)(nil), // 13: VCSEC.WhitelistInfo - (*WhitelistEntryInfo)(nil), // 14: VCSEC.WhitelistEntryInfo - (*InformationRequest)(nil), // 15: VCSEC.InformationRequest - (*ClosureMoveRequest)(nil), // 16: VCSEC.ClosureMoveRequest - (*PermissionChange)(nil), // 17: VCSEC.PermissionChange - (*ReplaceKey)(nil), // 18: VCSEC.ReplaceKey - (*WhitelistOperation)(nil), // 19: VCSEC.WhitelistOperation - (*WhitelistOperationStatus)(nil), // 20: VCSEC.WhitelistOperation_status - (*SignedMessageStatus)(nil), // 21: VCSEC.SignedMessage_status - (*CommandStatus)(nil), // 22: VCSEC.CommandStatus - (*UnsignedMessage)(nil), // 23: VCSEC.UnsignedMessage - (*FromVCSECMessage)(nil), // 24: VCSEC.FromVCSECMessage - (keys.Role)(0), // 25: Keys.Role - (*errors.NominalError)(nil), // 26: Errors.NominalError + (ClosureState_E)(0), // 8: VCSEC.ClosureState_E + (VehicleLockState_E)(0), // 9: VCSEC.VehicleLockState_E + (VehicleSleepStatus_E)(0), // 10: VCSEC.VehicleSleepStatus_E + (UserPresence_E)(0), // 11: VCSEC.UserPresence_E + (*SignedMessage)(nil), // 12: VCSEC.SignedMessage + (*ToVCSECMessage)(nil), // 13: VCSEC.ToVCSECMessage + (*KeyIdentifier)(nil), // 14: VCSEC.KeyIdentifier + (*KeyMetadata)(nil), // 15: VCSEC.KeyMetadata + (*PublicKey)(nil), // 16: VCSEC.PublicKey + (*WhitelistInfo)(nil), // 17: VCSEC.WhitelistInfo + (*WhitelistEntryInfo)(nil), // 18: VCSEC.WhitelistEntryInfo + (*InformationRequest)(nil), // 19: VCSEC.InformationRequest + (*ClosureMoveRequest)(nil), // 20: VCSEC.ClosureMoveRequest + (*PermissionChange)(nil), // 21: VCSEC.PermissionChange + (*ReplaceKey)(nil), // 22: VCSEC.ReplaceKey + (*WhitelistOperation)(nil), // 23: VCSEC.WhitelistOperation + (*WhitelistOperationStatus)(nil), // 24: VCSEC.WhitelistOperation_status + (*SignedMessageStatus)(nil), // 25: VCSEC.SignedMessage_status + (*CommandStatus)(nil), // 26: VCSEC.CommandStatus + (*UnsignedMessage)(nil), // 27: VCSEC.UnsignedMessage + (*ClosureStatuses)(nil), // 28: VCSEC.ClosureStatuses + (*DetailedClosureStatus)(nil), // 29: VCSEC.DetailedClosureStatus + (*VehicleStatus)(nil), // 30: VCSEC.VehicleStatus + (*FromVCSECMessage)(nil), // 31: VCSEC.FromVCSECMessage + (keys.Role)(0), // 32: Keys.Role + (*errors.NominalError)(nil), // 33: Errors.NominalError } var file_vcsec_proto_depIdxs = []int32{ 0, // 0: VCSEC.SignedMessage.signatureType:type_name -> VCSEC.SignatureType - 8, // 1: VCSEC.ToVCSECMessage.signedMessage:type_name -> VCSEC.SignedMessage + 12, // 1: VCSEC.ToVCSECMessage.signedMessage:type_name -> VCSEC.SignedMessage 1, // 2: VCSEC.KeyMetadata.keyFormFactor:type_name -> VCSEC.KeyFormFactor - 10, // 3: VCSEC.WhitelistInfo.whitelistEntries:type_name -> VCSEC.KeyIdentifier - 10, // 4: VCSEC.WhitelistEntryInfo.keyId:type_name -> VCSEC.KeyIdentifier - 12, // 5: VCSEC.WhitelistEntryInfo.publicKey:type_name -> VCSEC.PublicKey - 11, // 6: VCSEC.WhitelistEntryInfo.metadataForKey:type_name -> VCSEC.KeyMetadata - 25, // 7: VCSEC.WhitelistEntryInfo.keyRole:type_name -> Keys.Role + 14, // 3: VCSEC.WhitelistInfo.whitelistEntries:type_name -> VCSEC.KeyIdentifier + 14, // 4: VCSEC.WhitelistEntryInfo.keyId:type_name -> VCSEC.KeyIdentifier + 16, // 5: VCSEC.WhitelistEntryInfo.publicKey:type_name -> VCSEC.PublicKey + 15, // 6: VCSEC.WhitelistEntryInfo.metadataForKey:type_name -> VCSEC.KeyMetadata + 32, // 7: VCSEC.WhitelistEntryInfo.keyRole:type_name -> Keys.Role 2, // 8: VCSEC.InformationRequest.informationRequestType:type_name -> VCSEC.InformationRequestType - 10, // 9: VCSEC.InformationRequest.keyId:type_name -> VCSEC.KeyIdentifier + 14, // 9: VCSEC.InformationRequest.keyId:type_name -> VCSEC.KeyIdentifier 4, // 10: VCSEC.ClosureMoveRequest.frontDriverDoor:type_name -> VCSEC.ClosureMoveType_E 4, // 11: VCSEC.ClosureMoveRequest.frontPassengerDoor:type_name -> VCSEC.ClosureMoveType_E 4, // 12: VCSEC.ClosureMoveRequest.rearDriverDoor:type_name -> VCSEC.ClosureMoveType_E @@ -2483,41 +3052,55 @@ var file_vcsec_proto_depIdxs = []int32{ 4, // 15: VCSEC.ClosureMoveRequest.frontTrunk:type_name -> VCSEC.ClosureMoveType_E 4, // 16: VCSEC.ClosureMoveRequest.chargePort:type_name -> VCSEC.ClosureMoveType_E 4, // 17: VCSEC.ClosureMoveRequest.tonneau:type_name -> VCSEC.ClosureMoveType_E - 12, // 18: VCSEC.PermissionChange.key:type_name -> VCSEC.PublicKey - 25, // 19: VCSEC.PermissionChange.keyRole:type_name -> Keys.Role - 12, // 20: VCSEC.ReplaceKey.publicKeyToReplace:type_name -> VCSEC.PublicKey - 12, // 21: VCSEC.ReplaceKey.keyToAdd:type_name -> VCSEC.PublicKey - 25, // 22: VCSEC.ReplaceKey.keyRole:type_name -> Keys.Role - 12, // 23: VCSEC.WhitelistOperation.addPublicKeyToWhitelist:type_name -> VCSEC.PublicKey - 12, // 24: VCSEC.WhitelistOperation.removePublicKeyFromWhitelist:type_name -> VCSEC.PublicKey - 17, // 25: VCSEC.WhitelistOperation.addPermissionsToPublicKey:type_name -> VCSEC.PermissionChange - 17, // 26: VCSEC.WhitelistOperation.removePermissionsFromPublicKey:type_name -> VCSEC.PermissionChange - 17, // 27: VCSEC.WhitelistOperation.addKeyToWhitelistAndAddPermissions:type_name -> VCSEC.PermissionChange - 17, // 28: VCSEC.WhitelistOperation.updateKeyAndPermissions:type_name -> VCSEC.PermissionChange - 17, // 29: VCSEC.WhitelistOperation.addImpermanentKey:type_name -> VCSEC.PermissionChange - 17, // 30: VCSEC.WhitelistOperation.addImpermanentKeyAndRemoveExisting:type_name -> VCSEC.PermissionChange - 18, // 31: VCSEC.WhitelistOperation.replaceKey:type_name -> VCSEC.ReplaceKey - 11, // 32: VCSEC.WhitelistOperation.metadataForKey:type_name -> VCSEC.KeyMetadata + 16, // 18: VCSEC.PermissionChange.key:type_name -> VCSEC.PublicKey + 32, // 19: VCSEC.PermissionChange.keyRole:type_name -> Keys.Role + 16, // 20: VCSEC.ReplaceKey.publicKeyToReplace:type_name -> VCSEC.PublicKey + 16, // 21: VCSEC.ReplaceKey.keyToAdd:type_name -> VCSEC.PublicKey + 32, // 22: VCSEC.ReplaceKey.keyRole:type_name -> Keys.Role + 16, // 23: VCSEC.WhitelistOperation.addPublicKeyToWhitelist:type_name -> VCSEC.PublicKey + 16, // 24: VCSEC.WhitelistOperation.removePublicKeyFromWhitelist:type_name -> VCSEC.PublicKey + 21, // 25: VCSEC.WhitelistOperation.addPermissionsToPublicKey:type_name -> VCSEC.PermissionChange + 21, // 26: VCSEC.WhitelistOperation.removePermissionsFromPublicKey:type_name -> VCSEC.PermissionChange + 21, // 27: VCSEC.WhitelistOperation.addKeyToWhitelistAndAddPermissions:type_name -> VCSEC.PermissionChange + 21, // 28: VCSEC.WhitelistOperation.updateKeyAndPermissions:type_name -> VCSEC.PermissionChange + 21, // 29: VCSEC.WhitelistOperation.addImpermanentKey:type_name -> VCSEC.PermissionChange + 21, // 30: VCSEC.WhitelistOperation.addImpermanentKeyAndRemoveExisting:type_name -> VCSEC.PermissionChange + 22, // 31: VCSEC.WhitelistOperation.replaceKey:type_name -> VCSEC.ReplaceKey + 15, // 32: VCSEC.WhitelistOperation.metadataForKey:type_name -> VCSEC.KeyMetadata 7, // 33: VCSEC.WhitelistOperation_status.whitelistOperationInformation:type_name -> VCSEC.WhitelistOperation_information_E - 10, // 34: VCSEC.WhitelistOperation_status.signerOfOperation:type_name -> VCSEC.KeyIdentifier + 14, // 34: VCSEC.WhitelistOperation_status.signerOfOperation:type_name -> VCSEC.KeyIdentifier 5, // 35: VCSEC.WhitelistOperation_status.operationStatus:type_name -> VCSEC.OperationStatus_E 6, // 36: VCSEC.SignedMessage_status.signedMessageInformation:type_name -> VCSEC.SignedMessage_information_E 5, // 37: VCSEC.CommandStatus.operationStatus:type_name -> VCSEC.OperationStatus_E - 21, // 38: VCSEC.CommandStatus.signedMessageStatus:type_name -> VCSEC.SignedMessage_status - 20, // 39: VCSEC.CommandStatus.whitelistOperationStatus:type_name -> VCSEC.WhitelistOperation_status - 15, // 40: VCSEC.UnsignedMessage.InformationRequest:type_name -> VCSEC.InformationRequest + 25, // 38: VCSEC.CommandStatus.signedMessageStatus:type_name -> VCSEC.SignedMessage_status + 24, // 39: VCSEC.CommandStatus.whitelistOperationStatus:type_name -> VCSEC.WhitelistOperation_status + 19, // 40: VCSEC.UnsignedMessage.InformationRequest:type_name -> VCSEC.InformationRequest 3, // 41: VCSEC.UnsignedMessage.RKEAction:type_name -> VCSEC.RKEAction_E - 16, // 42: VCSEC.UnsignedMessage.closureMoveRequest:type_name -> VCSEC.ClosureMoveRequest - 19, // 43: VCSEC.UnsignedMessage.WhitelistOperation:type_name -> VCSEC.WhitelistOperation - 22, // 44: VCSEC.FromVCSECMessage.commandStatus:type_name -> VCSEC.CommandStatus - 13, // 45: VCSEC.FromVCSECMessage.whitelistInfo:type_name -> VCSEC.WhitelistInfo - 14, // 46: VCSEC.FromVCSECMessage.whitelistEntryInfo:type_name -> VCSEC.WhitelistEntryInfo - 26, // 47: VCSEC.FromVCSECMessage.nominalError:type_name -> Errors.NominalError - 48, // [48:48] is the sub-list for method output_type - 48, // [48:48] is the sub-list for method input_type - 48, // [48:48] is the sub-list for extension type_name - 48, // [48:48] is the sub-list for extension extendee - 0, // [0:48] is the sub-list for field type_name + 20, // 42: VCSEC.UnsignedMessage.closureMoveRequest:type_name -> VCSEC.ClosureMoveRequest + 23, // 43: VCSEC.UnsignedMessage.WhitelistOperation:type_name -> VCSEC.WhitelistOperation + 8, // 44: VCSEC.ClosureStatuses.frontDriverDoor:type_name -> VCSEC.ClosureState_E + 8, // 45: VCSEC.ClosureStatuses.frontPassengerDoor:type_name -> VCSEC.ClosureState_E + 8, // 46: VCSEC.ClosureStatuses.rearDriverDoor:type_name -> VCSEC.ClosureState_E + 8, // 47: VCSEC.ClosureStatuses.rearPassengerDoor:type_name -> VCSEC.ClosureState_E + 8, // 48: VCSEC.ClosureStatuses.rearTrunk:type_name -> VCSEC.ClosureState_E + 8, // 49: VCSEC.ClosureStatuses.frontTrunk:type_name -> VCSEC.ClosureState_E + 8, // 50: VCSEC.ClosureStatuses.chargePort:type_name -> VCSEC.ClosureState_E + 8, // 51: VCSEC.ClosureStatuses.tonneau:type_name -> VCSEC.ClosureState_E + 28, // 52: VCSEC.VehicleStatus.closureStatuses:type_name -> VCSEC.ClosureStatuses + 9, // 53: VCSEC.VehicleStatus.vehicleLockState:type_name -> VCSEC.VehicleLockState_E + 10, // 54: VCSEC.VehicleStatus.vehicleSleepStatus:type_name -> VCSEC.VehicleSleepStatus_E + 11, // 55: VCSEC.VehicleStatus.userPresence:type_name -> VCSEC.UserPresence_E + 29, // 56: VCSEC.VehicleStatus.detailedClosureStatus:type_name -> VCSEC.DetailedClosureStatus + 30, // 57: VCSEC.FromVCSECMessage.vehicleStatus:type_name -> VCSEC.VehicleStatus + 26, // 58: VCSEC.FromVCSECMessage.commandStatus:type_name -> VCSEC.CommandStatus + 17, // 59: VCSEC.FromVCSECMessage.whitelistInfo:type_name -> VCSEC.WhitelistInfo + 18, // 60: VCSEC.FromVCSECMessage.whitelistEntryInfo:type_name -> VCSEC.WhitelistEntryInfo + 33, // 61: VCSEC.FromVCSECMessage.nominalError:type_name -> Errors.NominalError + 62, // [62:62] is the sub-list for method output_type + 62, // [62:62] is the sub-list for method input_type + 62, // [62:62] is the sub-list for extension type_name + 62, // [62:62] is the sub-list for extension extendee + 0, // [0:62] is the sub-list for field type_name } func init() { file_vcsec_proto_init() } @@ -2719,6 +3302,42 @@ func file_vcsec_proto_init() { } } file_vcsec_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClosureStatuses); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vcsec_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetailedClosureStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vcsec_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VehicleStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_vcsec_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FromVCSECMessage); i { case 0: return &v.state @@ -2762,7 +3381,8 @@ func file_vcsec_proto_init() { (*UnsignedMessage_ClosureMoveRequest)(nil), (*UnsignedMessage_WhitelistOperation)(nil), } - file_vcsec_proto_msgTypes[16].OneofWrappers = []interface{}{ + file_vcsec_proto_msgTypes[19].OneofWrappers = []interface{}{ + (*FromVCSECMessage_VehicleStatus)(nil), (*FromVCSECMessage_CommandStatus)(nil), (*FromVCSECMessage_WhitelistInfo)(nil), (*FromVCSECMessage_WhitelistEntryInfo)(nil), @@ -2773,8 +3393,8 @@ func file_vcsec_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_vcsec_proto_rawDesc, - NumEnums: 8, - NumMessages: 17, + NumEnums: 12, + NumMessages: 20, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/vehicle/security.go b/pkg/vehicle/security.go index 9a2b923..d7a0342 100644 --- a/pkg/vehicle/security.go +++ b/pkg/vehicle/security.go @@ -224,19 +224,7 @@ func (v *Vehicle) RemoveKey(ctx context.Context, publicKey *ecdh.PublicKey) erro } func (v *Vehicle) KeySummary(ctx context.Context) (*vcsec.WhitelistInfo, error) { - payload := vcsec.UnsignedMessage{ - SubMessage: &vcsec.UnsignedMessage_InformationRequest{ - InformationRequest: &vcsec.InformationRequest{ - InformationRequestType: vcsec.InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_INFO, - }, - }, - } - encodedPayload, err := proto.Marshal(&payload) - if err != nil { - return nil, err - } - done := func(v *vcsec.FromVCSECMessage) (bool, error) { return true, nil } - reply, err := v.getVCSECResult(ctx, encodedPayload, connector.AuthMethodNone, done) + reply, err := v.getVCSECInfo(ctx, vcsec.InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_INFO, slotNone) if err != nil { return nil, err } @@ -244,22 +232,7 @@ func (v *Vehicle) KeySummary(ctx context.Context) (*vcsec.WhitelistInfo, error) } func (v *Vehicle) KeyInfoBySlot(ctx context.Context, slot uint32) (*vcsec.WhitelistEntryInfo, error) { - payload := vcsec.UnsignedMessage{ - SubMessage: &vcsec.UnsignedMessage_InformationRequest{ - InformationRequest: &vcsec.InformationRequest{ - InformationRequestType: vcsec.InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_ENTRY_INFO, - Key: &vcsec.InformationRequest_Slot{ - Slot: slot, - }, - }, - }, - } - encodedPayload, err := proto.Marshal(&payload) - if err != nil { - return nil, err - } - done := func(v *vcsec.FromVCSECMessage) (bool, error) { return true, nil } - reply, err := v.getVCSECResult(ctx, encodedPayload, connector.AuthMethodNone, done) + reply, err := v.getVCSECInfo(ctx, vcsec.InformationRequestType_INFORMATION_REQUEST_TYPE_GET_WHITELIST_ENTRY_INFO, slot) if err != nil { return nil, err } diff --git a/pkg/vehicle/state.go b/pkg/vehicle/state.go new file mode 100644 index 0000000..d98f1da --- /dev/null +++ b/pkg/vehicle/state.go @@ -0,0 +1,16 @@ +package vehicle + +import ( + "context" + "github.com/teslamotors/vehicle-command/pkg/protocol/protobuf/vcsec" +) + +// BodyControllerState returns information about closures, locks, and infotainment sleep status. +// This method works over BLE even when infotainment is asleep. +func (v *Vehicle) BodyControllerState(ctx context.Context) (*vcsec.VehicleStatus, error) { + reply, err := v.getVCSECInfo(ctx, vcsec.InformationRequestType_INFORMATION_REQUEST_TYPE_GET_STATUS, slotNone) + if err != nil { + return nil, err + } + return reply.GetVehicleStatus(), nil +} diff --git a/pkg/vehicle/vcsec.go b/pkg/vehicle/vcsec.go index 5640732..b1618cd 100644 --- a/pkg/vehicle/vcsec.go +++ b/pkg/vehicle/vcsec.go @@ -104,6 +104,31 @@ func (v *Vehicle) getVCSECResult(ctx context.Context, payload []byte, auth conne } } +const slotNone = 0xFFFFFFFF + +func (v *Vehicle) getVCSECInfo(ctx context.Context, requestType vcsec.InformationRequestType, keySlot uint32) (*vcsec.FromVCSECMessage, error) { + payload := vcsec.UnsignedMessage{ + SubMessage: &vcsec.UnsignedMessage_InformationRequest{ + InformationRequest: &vcsec.InformationRequest{ + InformationRequestType: requestType, + }, + }, + } + if keySlot != slotNone { + payload.GetInformationRequest().Key = &vcsec.InformationRequest_Slot{ + Slot: keySlot, + } + } + + encodedPayload, err := proto.Marshal(&payload) + if err != nil { + return nil, err + } + + done := func(v *vcsec.FromVCSECMessage) (bool, error) { return true, nil } + return v.getVCSECResult(ctx, encodedPayload, connector.AuthMethodNone, done) +} + func isWhitelistOperationComplete(fromVCSEC *vcsec.FromVCSECMessage) (bool, error) { if opStatus := fromVCSEC.GetCommandStatus().GetWhitelistOperationStatus(); opStatus != nil { status := opStatus.GetWhitelistOperationInformation()