// Copyright 2018 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/assistant/embedded/v1alpha2/embedded_assistant.proto

package embedded

import (
	context "context"
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	latlng "google.golang.org/genproto/googleapis/type/latlng"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Indicates the type of event.
type AssistResponse_EventType int32

const (
	// No event specified.
	AssistResponse_EVENT_TYPE_UNSPECIFIED AssistResponse_EventType = 0
	// This event indicates that the server has detected the end of the user's
	// speech utterance and expects no additional speech. Therefore, the server
	// will not process additional audio (although it may subsequently return
	// additional results). The client should stop sending additional audio
	// data, half-close the gRPC connection, and wait for any additional results
	// until the server closes the gRPC connection.
	AssistResponse_END_OF_UTTERANCE AssistResponse_EventType = 1
)

// Enum value maps for AssistResponse_EventType.
var (
	AssistResponse_EventType_name = map[int32]string{
		0: "EVENT_TYPE_UNSPECIFIED",
		1: "END_OF_UTTERANCE",
	}
	AssistResponse_EventType_value = map[string]int32{
		"EVENT_TYPE_UNSPECIFIED": 0,
		"END_OF_UTTERANCE":       1,
	}
)

func (x AssistResponse_EventType) Enum() *AssistResponse_EventType {
	p := new(AssistResponse_EventType)
	*p = x
	return p
}

func (x AssistResponse_EventType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (AssistResponse_EventType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[0].Descriptor()
}

func (AssistResponse_EventType) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[0]
}

func (x AssistResponse_EventType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use AssistResponse_EventType.Descriptor instead.
func (AssistResponse_EventType) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{1, 0}
}

// Audio encoding of the data sent in the audio message.
// Audio must be one-channel (mono).
type AudioInConfig_Encoding int32

const (
	// Not specified. Will return result [google.rpc.Code.INVALID_ARGUMENT][].
	AudioInConfig_ENCODING_UNSPECIFIED AudioInConfig_Encoding = 0
	// Uncompressed 16-bit signed little-endian samples (Linear PCM).
	// This encoding includes no header, only the raw audio bytes.
	AudioInConfig_LINEAR16 AudioInConfig_Encoding = 1
	// [`FLAC`](https://xiph.org/flac/documentation.html) (Free Lossless Audio
	// Codec) is the recommended encoding because it is
	// lossless--therefore recognition is not compromised--and
	// requires only about half the bandwidth of `LINEAR16`. This encoding
	// includes the `FLAC` stream header followed by audio data. It supports
	// 16-bit and 24-bit samples, however, not all fields in `STREAMINFO` are
	// supported.
	AudioInConfig_FLAC AudioInConfig_Encoding = 2
)

// Enum value maps for AudioInConfig_Encoding.
var (
	AudioInConfig_Encoding_name = map[int32]string{
		0: "ENCODING_UNSPECIFIED",
		1: "LINEAR16",
		2: "FLAC",
	}
	AudioInConfig_Encoding_value = map[string]int32{
		"ENCODING_UNSPECIFIED": 0,
		"LINEAR16":             1,
		"FLAC":                 2,
	}
)

func (x AudioInConfig_Encoding) Enum() *AudioInConfig_Encoding {
	p := new(AudioInConfig_Encoding)
	*p = x
	return p
}

func (x AudioInConfig_Encoding) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (AudioInConfig_Encoding) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[1].Descriptor()
}

func (AudioInConfig_Encoding) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[1]
}

func (x AudioInConfig_Encoding) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use AudioInConfig_Encoding.Descriptor instead.
func (AudioInConfig_Encoding) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{4, 0}
}

// Audio encoding of the data returned in the audio message. All encodings are
// raw audio bytes with no header, except as indicated below.
type AudioOutConfig_Encoding int32

const (
	// Not specified. Will return result [google.rpc.Code.INVALID_ARGUMENT][].
	AudioOutConfig_ENCODING_UNSPECIFIED AudioOutConfig_Encoding = 0
	// Uncompressed 16-bit signed little-endian samples (Linear PCM).
	AudioOutConfig_LINEAR16 AudioOutConfig_Encoding = 1
	// MP3 audio encoding. The sample rate is encoded in the payload.
	AudioOutConfig_MP3 AudioOutConfig_Encoding = 2
	// Opus-encoded audio wrapped in an ogg container. The result will be a
	// file which can be played natively on Android and in some browsers (such
	// as Chrome). The quality of the encoding is considerably higher than MP3
	// while using the same bitrate. The sample rate is encoded in the payload.
	AudioOutConfig_OPUS_IN_OGG AudioOutConfig_Encoding = 3
)

// Enum value maps for AudioOutConfig_Encoding.
var (
	AudioOutConfig_Encoding_name = map[int32]string{
		0: "ENCODING_UNSPECIFIED",
		1: "LINEAR16",
		2: "MP3",
		3: "OPUS_IN_OGG",
	}
	AudioOutConfig_Encoding_value = map[string]int32{
		"ENCODING_UNSPECIFIED": 0,
		"LINEAR16":             1,
		"MP3":                  2,
		"OPUS_IN_OGG":          3,
	}
)

func (x AudioOutConfig_Encoding) Enum() *AudioOutConfig_Encoding {
	p := new(AudioOutConfig_Encoding)
	*p = x
	return p
}

func (x AudioOutConfig_Encoding) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (AudioOutConfig_Encoding) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[2].Descriptor()
}

func (AudioOutConfig_Encoding) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[2]
}

func (x AudioOutConfig_Encoding) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use AudioOutConfig_Encoding.Descriptor instead.
func (AudioOutConfig_Encoding) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{5, 0}
}

// Possible modes for visual screen-output on the device.
type ScreenOutConfig_ScreenMode int32

const (
	// No video mode specified.
	// The Assistant may respond as if in `OFF` mode.
	ScreenOutConfig_SCREEN_MODE_UNSPECIFIED ScreenOutConfig_ScreenMode = 0
	// Screen is off (or has brightness or other settings set so low it is
	// not visible). The Assistant will typically not return a screen response
	// in this mode.
	ScreenOutConfig_OFF ScreenOutConfig_ScreenMode = 1
	// The Assistant will typically return a partial-screen response in this
	// mode.
	ScreenOutConfig_PLAYING ScreenOutConfig_ScreenMode = 3
)

// Enum value maps for ScreenOutConfig_ScreenMode.
var (
	ScreenOutConfig_ScreenMode_name = map[int32]string{
		0: "SCREEN_MODE_UNSPECIFIED",
		1: "OFF",
		3: "PLAYING",
	}
	ScreenOutConfig_ScreenMode_value = map[string]int32{
		"SCREEN_MODE_UNSPECIFIED": 0,
		"OFF":                     1,
		"PLAYING":                 3,
	}
)

func (x ScreenOutConfig_ScreenMode) Enum() *ScreenOutConfig_ScreenMode {
	p := new(ScreenOutConfig_ScreenMode)
	*p = x
	return p
}

func (x ScreenOutConfig_ScreenMode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ScreenOutConfig_ScreenMode) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[3].Descriptor()
}

func (ScreenOutConfig_ScreenMode) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[3]
}

func (x ScreenOutConfig_ScreenMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ScreenOutConfig_ScreenMode.Descriptor instead.
func (ScreenOutConfig_ScreenMode) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{6, 0}
}

// Possible formats of the screen data.
type ScreenOut_Format int32

const (
	// No format specified.
	ScreenOut_FORMAT_UNSPECIFIED ScreenOut_Format = 0
	// Data will contain a fully-formed HTML5 layout encoded in UTF-8, e.g.
	// `<html><body><div>...</div></body></html>`. It is intended to be rendered
	// along with the audio response. Note that HTML5 doctype should be included
	// in the actual HTML data.
	ScreenOut_HTML ScreenOut_Format = 1
)

// Enum value maps for ScreenOut_Format.
var (
	ScreenOut_Format_name = map[int32]string{
		0: "FORMAT_UNSPECIFIED",
		1: "HTML",
	}
	ScreenOut_Format_value = map[string]int32{
		"FORMAT_UNSPECIFIED": 0,
		"HTML":               1,
	}
)

func (x ScreenOut_Format) Enum() *ScreenOut_Format {
	p := new(ScreenOut_Format)
	*p = x
	return p
}

func (x ScreenOut_Format) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (ScreenOut_Format) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[4].Descriptor()
}

func (ScreenOut_Format) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[4]
}

func (x ScreenOut_Format) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use ScreenOut_Format.Descriptor instead.
func (ScreenOut_Format) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{10, 0}
}

// Possible states of the microphone after a `Assist` RPC completes.
type DialogStateOut_MicrophoneMode int32

const (
	// No mode specified.
	DialogStateOut_MICROPHONE_MODE_UNSPECIFIED DialogStateOut_MicrophoneMode = 0
	// The service is not expecting a follow-on question from the user.
	// The microphone should remain off until the user re-activates it.
	DialogStateOut_CLOSE_MICROPHONE DialogStateOut_MicrophoneMode = 1
	// The service is expecting a follow-on question from the user. The
	// microphone should be re-opened when the `AudioOut` playback completes
	// (by starting a new `Assist` RPC call to send the new audio).
	DialogStateOut_DIALOG_FOLLOW_ON DialogStateOut_MicrophoneMode = 2
)

// Enum value maps for DialogStateOut_MicrophoneMode.
var (
	DialogStateOut_MicrophoneMode_name = map[int32]string{
		0: "MICROPHONE_MODE_UNSPECIFIED",
		1: "CLOSE_MICROPHONE",
		2: "DIALOG_FOLLOW_ON",
	}
	DialogStateOut_MicrophoneMode_value = map[string]int32{
		"MICROPHONE_MODE_UNSPECIFIED": 0,
		"CLOSE_MICROPHONE":            1,
		"DIALOG_FOLLOW_ON":            2,
	}
)

func (x DialogStateOut_MicrophoneMode) Enum() *DialogStateOut_MicrophoneMode {
	p := new(DialogStateOut_MicrophoneMode)
	*p = x
	return p
}

func (x DialogStateOut_MicrophoneMode) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (DialogStateOut_MicrophoneMode) Descriptor() protoreflect.EnumDescriptor {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[5].Descriptor()
}

func (DialogStateOut_MicrophoneMode) Type() protoreflect.EnumType {
	return &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes[5]
}

func (x DialogStateOut_MicrophoneMode) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use DialogStateOut_MicrophoneMode.Descriptor instead.
func (DialogStateOut_MicrophoneMode) EnumDescriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{13, 0}
}

// The top-level message sent by the client. Clients must send at least two, and
// typically numerous `AssistRequest` messages. The first message must
// contain a `config` message and must not contain `audio_in` data. All
// subsequent messages must contain `audio_in` data and must not contain a
// `config` message.
type AssistRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Exactly one of these fields must be specified in each `AssistRequest`.
	//
	// Types that are assignable to Type:
	//	*AssistRequest_Config
	//	*AssistRequest_AudioIn
	Type isAssistRequest_Type `protobuf_oneof:"type"`
}

func (x *AssistRequest) Reset() {
	*x = AssistRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AssistRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AssistRequest) ProtoMessage() {}

func (x *AssistRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AssistRequest.ProtoReflect.Descriptor instead.
func (*AssistRequest) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{0}
}

func (m *AssistRequest) GetType() isAssistRequest_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *AssistRequest) GetConfig() *AssistConfig {
	if x, ok := x.GetType().(*AssistRequest_Config); ok {
		return x.Config
	}
	return nil
}

func (x *AssistRequest) GetAudioIn() []byte {
	if x, ok := x.GetType().(*AssistRequest_AudioIn); ok {
		return x.AudioIn
	}
	return nil
}

type isAssistRequest_Type interface {
	isAssistRequest_Type()
}

type AssistRequest_Config struct {
	// The `config` message provides information to the recognizer that
	// specifies how to process the request.
	// The first `AssistRequest` message must contain a `config` message.
	Config *AssistConfig `protobuf:"bytes,1,opt,name=config,proto3,oneof"`
}

type AssistRequest_AudioIn struct {
	// The audio data to be recognized. Sequential chunks of audio data are sent
	// in sequential `AssistRequest` messages. The first `AssistRequest`
	// message must not contain `audio_in` data and all subsequent
	// `AssistRequest` messages must contain `audio_in` data. The audio bytes
	// must be encoded as specified in `AudioInConfig`.
	// Audio must be sent at approximately real-time (16000 samples per second).
	// An error will be returned if audio is sent significantly faster or
	// slower.
	AudioIn []byte `protobuf:"bytes,2,opt,name=audio_in,json=audioIn,proto3,oneof"`
}

func (*AssistRequest_Config) isAssistRequest_Type() {}

func (*AssistRequest_AudioIn) isAssistRequest_Type() {}

// The top-level message received by the client. A series of one or more
// `AssistResponse` messages are streamed back to the client.
type AssistResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Output-only* Indicates the type of event.
	EventType AssistResponse_EventType `protobuf:"varint,1,opt,name=event_type,json=eventType,proto3,enum=google.assistant.embedded.v1alpha2.AssistResponse_EventType" json:"event_type,omitempty"`
	// *Output-only* The audio containing the Assistant's response to the query.
	AudioOut *AudioOut `protobuf:"bytes,3,opt,name=audio_out,json=audioOut,proto3" json:"audio_out,omitempty"`
	// *Output-only* Contains the Assistant's visual response to the query.
	ScreenOut *ScreenOut `protobuf:"bytes,4,opt,name=screen_out,json=screenOut,proto3" json:"screen_out,omitempty"`
	// *Output-only* Contains the action triggered by the query with the
	// appropriate payloads and semantic parsing.
	DeviceAction *DeviceAction `protobuf:"bytes,6,opt,name=device_action,json=deviceAction,proto3" json:"device_action,omitempty"`
	// *Output-only* This repeated list contains zero or more speech recognition
	// results that correspond to consecutive portions of the audio currently
	// being processed, starting with the portion corresponding to the earliest
	// audio (and most stable portion) to the portion corresponding to the most
	// recent audio. The strings can be concatenated to view the full
	// in-progress response. When the speech recognition completes, this list
	// will contain one item with `stability` of `1.0`.
	SpeechResults []*SpeechRecognitionResult `protobuf:"bytes,2,rep,name=speech_results,json=speechResults,proto3" json:"speech_results,omitempty"`
	// *Output-only* Contains output related to the user's query.
	DialogStateOut *DialogStateOut `protobuf:"bytes,5,opt,name=dialog_state_out,json=dialogStateOut,proto3" json:"dialog_state_out,omitempty"`
	// *Output-only* Debugging info for developer. Only returned if request set
	// `return_debug_info` to true.
	DebugInfo *DebugInfo `protobuf:"bytes,8,opt,name=debug_info,json=debugInfo,proto3" json:"debug_info,omitempty"`
}

func (x *AssistResponse) Reset() {
	*x = AssistResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AssistResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AssistResponse) ProtoMessage() {}

func (x *AssistResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[1]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AssistResponse.ProtoReflect.Descriptor instead.
func (*AssistResponse) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{1}
}

func (x *AssistResponse) GetEventType() AssistResponse_EventType {
	if x != nil {
		return x.EventType
	}
	return AssistResponse_EVENT_TYPE_UNSPECIFIED
}

func (x *AssistResponse) GetAudioOut() *AudioOut {
	if x != nil {
		return x.AudioOut
	}
	return nil
}

func (x *AssistResponse) GetScreenOut() *ScreenOut {
	if x != nil {
		return x.ScreenOut
	}
	return nil
}

func (x *AssistResponse) GetDeviceAction() *DeviceAction {
	if x != nil {
		return x.DeviceAction
	}
	return nil
}

func (x *AssistResponse) GetSpeechResults() []*SpeechRecognitionResult {
	if x != nil {
		return x.SpeechResults
	}
	return nil
}

func (x *AssistResponse) GetDialogStateOut() *DialogStateOut {
	if x != nil {
		return x.DialogStateOut
	}
	return nil
}

func (x *AssistResponse) GetDebugInfo() *DebugInfo {
	if x != nil {
		return x.DebugInfo
	}
	return nil
}

// Debug info for developer. Only returned if request set `return_debug_info`
// to true.
type DebugInfo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The original JSON response from an Action-on-Google agent to Google server.
	// See
	// https://developers.google.com/actions/reference/rest/Shared.Types/AppResponse.
	// It will only be populated if the request maker owns the AoG project and the
	// AoG project is in preview mode.
	AogAgentToAssistantJson string `protobuf:"bytes,1,opt,name=aog_agent_to_assistant_json,json=aogAgentToAssistantJson,proto3" json:"aog_agent_to_assistant_json,omitempty"`
}

func (x *DebugInfo) Reset() {
	*x = DebugInfo{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DebugInfo) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DebugInfo) ProtoMessage() {}

func (x *DebugInfo) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[2]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use DebugInfo.ProtoReflect.Descriptor instead.
func (*DebugInfo) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{2}
}

func (x *DebugInfo) GetAogAgentToAssistantJson() string {
	if x != nil {
		return x.AogAgentToAssistantJson
	}
	return ""
}

// Specifies how to process the `AssistRequest` messages.
type AssistConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//	*AssistConfig_AudioInConfig
	//	*AssistConfig_TextQuery
	Type isAssistConfig_Type `protobuf_oneof:"type"`
	// *Required* Specifies how to format the audio that will be returned.
	AudioOutConfig *AudioOutConfig `protobuf:"bytes,2,opt,name=audio_out_config,json=audioOutConfig,proto3" json:"audio_out_config,omitempty"`
	// *Optional* Specifies the desired format to use when server returns a
	// visual screen response.
	ScreenOutConfig *ScreenOutConfig `protobuf:"bytes,8,opt,name=screen_out_config,json=screenOutConfig,proto3" json:"screen_out_config,omitempty"`
	// *Required* Represents the current dialog state.
	DialogStateIn *DialogStateIn `protobuf:"bytes,3,opt,name=dialog_state_in,json=dialogStateIn,proto3" json:"dialog_state_in,omitempty"`
	// Device configuration that uniquely identifies a specific device.
	DeviceConfig *DeviceConfig `protobuf:"bytes,4,opt,name=device_config,json=deviceConfig,proto3" json:"device_config,omitempty"`
	// *Optional* Debugging parameters for the whole `Assist` RPC.
	DebugConfig *DebugConfig `protobuf:"bytes,5,opt,name=debug_config,json=debugConfig,proto3" json:"debug_config,omitempty"`
}

func (x *AssistConfig) Reset() {
	*x = AssistConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AssistConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AssistConfig) ProtoMessage() {}

func (x *AssistConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[3]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AssistConfig.ProtoReflect.Descriptor instead.
func (*AssistConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{3}
}

func (m *AssistConfig) GetType() isAssistConfig_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *AssistConfig) GetAudioInConfig() *AudioInConfig {
	if x, ok := x.GetType().(*AssistConfig_AudioInConfig); ok {
		return x.AudioInConfig
	}
	return nil
}

func (x *AssistConfig) GetTextQuery() string {
	if x, ok := x.GetType().(*AssistConfig_TextQuery); ok {
		return x.TextQuery
	}
	return ""
}

func (x *AssistConfig) GetAudioOutConfig() *AudioOutConfig {
	if x != nil {
		return x.AudioOutConfig
	}
	return nil
}

func (x *AssistConfig) GetScreenOutConfig() *ScreenOutConfig {
	if x != nil {
		return x.ScreenOutConfig
	}
	return nil
}

func (x *AssistConfig) GetDialogStateIn() *DialogStateIn {
	if x != nil {
		return x.DialogStateIn
	}
	return nil
}

func (x *AssistConfig) GetDeviceConfig() *DeviceConfig {
	if x != nil {
		return x.DeviceConfig
	}
	return nil
}

func (x *AssistConfig) GetDebugConfig() *DebugConfig {
	if x != nil {
		return x.DebugConfig
	}
	return nil
}

type isAssistConfig_Type interface {
	isAssistConfig_Type()
}

type AssistConfig_AudioInConfig struct {
	// Specifies how to process the subsequent incoming audio. Required if
	// [AssistRequest.audio_in][google.assistant.embedded.v1alpha2.AssistRequest.audio_in]
	// bytes will be provided in subsequent requests.
	AudioInConfig *AudioInConfig `protobuf:"bytes,1,opt,name=audio_in_config,json=audioInConfig,proto3,oneof"`
}

type AssistConfig_TextQuery struct {
	// The text input to be sent to the Assistant. This can be populated from a
	// text interface if audio input is not available.
	TextQuery string `protobuf:"bytes,6,opt,name=text_query,json=textQuery,proto3,oneof"`
}

func (*AssistConfig_AudioInConfig) isAssistConfig_Type() {}

func (*AssistConfig_TextQuery) isAssistConfig_Type() {}

// Specifies how to process the `audio_in` data that will be provided in
// subsequent requests. For recommended settings, see the Google Assistant SDK
// [best
// practices](https://developers.google.com/assistant/sdk/guides/service/python/best-practices/audio).
type AudioInConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Required* Encoding of audio data sent in all `audio_in` messages.
	Encoding AudioInConfig_Encoding `protobuf:"varint,1,opt,name=encoding,proto3,enum=google.assistant.embedded.v1alpha2.AudioInConfig_Encoding" json:"encoding,omitempty"`
	// *Required* Sample rate (in Hertz) of the audio data sent in all `audio_in`
	// messages. Valid values are from 16000-24000, but 16000 is optimal.
	// For best results, set the sampling rate of the audio source to 16000 Hz.
	// If that's not possible, use the native sample rate of the audio source
	// (instead of re-sampling).
	SampleRateHertz int32 `protobuf:"varint,2,opt,name=sample_rate_hertz,json=sampleRateHertz,proto3" json:"sample_rate_hertz,omitempty"`
}

func (x *AudioInConfig) Reset() {
	*x = AudioInConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AudioInConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AudioInConfig) ProtoMessage() {}

func (x *AudioInConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[4]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AudioInConfig.ProtoReflect.Descriptor instead.
func (*AudioInConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{4}
}

func (x *AudioInConfig) GetEncoding() AudioInConfig_Encoding {
	if x != nil {
		return x.Encoding
	}
	return AudioInConfig_ENCODING_UNSPECIFIED
}

func (x *AudioInConfig) GetSampleRateHertz() int32 {
	if x != nil {
		return x.SampleRateHertz
	}
	return 0
}

// Specifies the desired format for the server to use when it returns
// `audio_out` messages.
type AudioOutConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Required* The encoding of audio data to be returned in all `audio_out`
	// messages.
	Encoding AudioOutConfig_Encoding `protobuf:"varint,1,opt,name=encoding,proto3,enum=google.assistant.embedded.v1alpha2.AudioOutConfig_Encoding" json:"encoding,omitempty"`
	// *Required* The sample rate in Hertz of the audio data returned in
	// `audio_out` messages. Valid values are: 16000-24000.
	SampleRateHertz int32 `protobuf:"varint,2,opt,name=sample_rate_hertz,json=sampleRateHertz,proto3" json:"sample_rate_hertz,omitempty"`
	// *Required* Current volume setting of the device's audio output.
	// Valid values are 1 to 100 (corresponding to 1% to 100%).
	VolumePercentage int32 `protobuf:"varint,3,opt,name=volume_percentage,json=volumePercentage,proto3" json:"volume_percentage,omitempty"`
}

func (x *AudioOutConfig) Reset() {
	*x = AudioOutConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AudioOutConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AudioOutConfig) ProtoMessage() {}

func (x *AudioOutConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[5]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use AudioOutConfig.ProtoReflect.Descriptor instead.
func (*AudioOutConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{5}
}

func (x *AudioOutConfig) GetEncoding() AudioOutConfig_Encoding {
	if x != nil {
		return x.Encoding
	}
	return AudioOutConfig_ENCODING_UNSPECIFIED
}

func (x *AudioOutConfig) GetSampleRateHertz() int32 {
	if x != nil {
		return x.SampleRateHertz
	}
	return 0
}

func (x *AudioOutConfig) GetVolumePercentage() int32 {
	if x != nil {
		return x.VolumePercentage
	}
	return 0
}

// Specifies the desired format for the server to use when it returns
// `screen_out` response.
type ScreenOutConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Current visual screen-mode for the device while issuing the query.
	ScreenMode ScreenOutConfig_ScreenMode `protobuf:"varint,1,opt,name=screen_mode,json=screenMode,proto3,enum=google.assistant.embedded.v1alpha2.ScreenOutConfig_ScreenMode" json:"screen_mode,omitempty"`
}

func (x *ScreenOutConfig) Reset() {
	*x = ScreenOutConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ScreenOutConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ScreenOutConfig) ProtoMessage() {}

func (x *ScreenOutConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[6]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use ScreenOutConfig.ProtoReflect.Descriptor instead.
func (*ScreenOutConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{6}
}

func (x *ScreenOutConfig) GetScreenMode() ScreenOutConfig_ScreenMode {
	if x != nil {
		return x.ScreenMode
	}
	return ScreenOutConfig_SCREEN_MODE_UNSPECIFIED
}

// Provides information about the current dialog state.
type DialogStateIn struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Required* This field must always be set to the
	// [DialogStateOut.conversation_state][google.assistant.embedded.v1alpha2.DialogStateOut.conversation_state]
	// value that was returned in the prior `Assist` RPC. It should only be
	// omitted (field not set) if there was no prior `Assist` RPC because this is
	// the first `Assist` RPC made by this device after it was first setup and/or
	// a factory-default reset.
	ConversationState []byte `protobuf:"bytes,1,opt,name=conversation_state,json=conversationState,proto3" json:"conversation_state,omitempty"`
	// *Required* Language of the request in
	// [IETF BCP 47 syntax](https://tools.ietf.org/html/bcp47) (for example,
	// "en-US"). See [Language
	// Support](https://developers.google.com/assistant/sdk/reference/rpc/languages)
	// for more information. If you have selected a language for this `device_id`
	// using the
	// [Settings](https://developers.google.com/assistant/sdk/reference/assistant-app/assistant-settings)
	// menu in your phone's Google Assistant app, that selection will override
	// this value.
	LanguageCode string `protobuf:"bytes,2,opt,name=language_code,json=languageCode,proto3" json:"language_code,omitempty"`
	// *Optional* Location of the device where the query originated.
	DeviceLocation *DeviceLocation `protobuf:"bytes,5,opt,name=device_location,json=deviceLocation,proto3" json:"device_location,omitempty"`
	// *Optional* If true, the server will treat the request as a new conversation
	// and not use state from the prior request. Set this field to true when the
	// conversation should be restarted, such as after a device reboot, or after a
	// significant lapse of time since the prior query.
	IsNewConversation bool `protobuf:"varint,7,opt,name=is_new_conversation,json=isNewConversation,proto3" json:"is_new_conversation,omitempty"`
}

func (x *DialogStateIn) Reset() {
	*x = DialogStateIn{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DialogStateIn) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DialogStateIn) ProtoMessage() {}

func (x *DialogStateIn) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[7]
	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 DialogStateIn.ProtoReflect.Descriptor instead.
func (*DialogStateIn) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{7}
}

func (x *DialogStateIn) GetConversationState() []byte {
	if x != nil {
		return x.ConversationState
	}
	return nil
}

func (x *DialogStateIn) GetLanguageCode() string {
	if x != nil {
		return x.LanguageCode
	}
	return ""
}

func (x *DialogStateIn) GetDeviceLocation() *DeviceLocation {
	if x != nil {
		return x.DeviceLocation
	}
	return nil
}

func (x *DialogStateIn) GetIsNewConversation() bool {
	if x != nil {
		return x.IsNewConversation
	}
	return false
}

// *Required* Fields that identify the device to the Assistant.
//
// See also:
//
// *   [Register a Device - REST
// API](https://developers.google.com/assistant/sdk/reference/device-registration/register-device-manual)
// *   [Device Model and Instance
// Schemas](https://developers.google.com/assistant/sdk/reference/device-registration/model-and-instance-schemas)
// *   [Device
// Proto](https://developers.google.com/assistant/sdk/reference/rpc/google.assistant.devices.v1alpha2#device)
type DeviceConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Required* Unique identifier for the device. The id length must be 128
	// characters or less. Example: DBCDW098234. This MUST match the device_id
	// returned from device registration. This device_id is used to match against
	// the user's registered devices to lookup the supported traits and
	// capabilities of this device. This information should not change across
	// device reboots. However, it should not be saved across
	// factory-default resets.
	DeviceId string `protobuf:"bytes,1,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
	// *Required* Unique identifier for the device model. The combination of
	// device_model_id and device_id must have been previously associated through
	// device registration.
	DeviceModelId string `protobuf:"bytes,3,opt,name=device_model_id,json=deviceModelId,proto3" json:"device_model_id,omitempty"`
}

func (x *DeviceConfig) Reset() {
	*x = DeviceConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeviceConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeviceConfig) ProtoMessage() {}

func (x *DeviceConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[8]
	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 DeviceConfig.ProtoReflect.Descriptor instead.
func (*DeviceConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{8}
}

func (x *DeviceConfig) GetDeviceId() string {
	if x != nil {
		return x.DeviceId
	}
	return ""
}

func (x *DeviceConfig) GetDeviceModelId() string {
	if x != nil {
		return x.DeviceModelId
	}
	return ""
}

// The audio containing the Assistant's response to the query. Sequential chunks
// of audio data are received in sequential `AssistResponse` messages.
type AudioOut struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Output-only* The audio data containing the Assistant's response to the
	// query. Sequential chunks of audio data are received in sequential
	// `AssistResponse` messages.
	AudioData []byte `protobuf:"bytes,1,opt,name=audio_data,json=audioData,proto3" json:"audio_data,omitempty"`
}

func (x *AudioOut) Reset() {
	*x = AudioOut{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AudioOut) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AudioOut) ProtoMessage() {}

func (x *AudioOut) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[9]
	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 AudioOut.ProtoReflect.Descriptor instead.
func (*AudioOut) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{9}
}

func (x *AudioOut) GetAudioData() []byte {
	if x != nil {
		return x.AudioData
	}
	return nil
}

// The Assistant's visual output response to query. Enabled by
// `screen_out_config`.
type ScreenOut struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Output-only* The format of the provided screen data.
	Format ScreenOut_Format `protobuf:"varint,1,opt,name=format,proto3,enum=google.assistant.embedded.v1alpha2.ScreenOut_Format" json:"format,omitempty"`
	// *Output-only* The raw screen data to be displayed as the result of the
	// Assistant query.
	Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"`
}

func (x *ScreenOut) Reset() {
	*x = ScreenOut{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *ScreenOut) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*ScreenOut) ProtoMessage() {}

func (x *ScreenOut) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[10]
	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 ScreenOut.ProtoReflect.Descriptor instead.
func (*ScreenOut) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{10}
}

func (x *ScreenOut) GetFormat() ScreenOut_Format {
	if x != nil {
		return x.Format
	}
	return ScreenOut_FORMAT_UNSPECIFIED
}

func (x *ScreenOut) GetData() []byte {
	if x != nil {
		return x.Data
	}
	return nil
}

// The response returned to the device if the user has triggered a Device
// Action. For example, a device which supports the query *Turn on the light*
// would receive a `DeviceAction` with a JSON payload containing the semantics
// of the request.
type DeviceAction struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// JSON containing the device command response generated from the triggered
	// Device Action grammar. The format is given by the
	// `action.devices.EXECUTE` intent for a given
	// [trait](https://developers.google.com/assistant/sdk/reference/traits/).
	DeviceRequestJson string `protobuf:"bytes,1,opt,name=device_request_json,json=deviceRequestJson,proto3" json:"device_request_json,omitempty"`
}

func (x *DeviceAction) Reset() {
	*x = DeviceAction{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeviceAction) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeviceAction) ProtoMessage() {}

func (x *DeviceAction) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[11]
	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 DeviceAction.ProtoReflect.Descriptor instead.
func (*DeviceAction) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{11}
}

func (x *DeviceAction) GetDeviceRequestJson() string {
	if x != nil {
		return x.DeviceRequestJson
	}
	return ""
}

// The estimated transcription of a phrase the user has spoken. This could be
// a single segment or the full guess of the user's spoken query.
type SpeechRecognitionResult struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Output-only* Transcript text representing the words that the user spoke.
	Transcript string `protobuf:"bytes,1,opt,name=transcript,proto3" json:"transcript,omitempty"`
	// *Output-only* An estimate of the likelihood that the Assistant will not
	// change its guess about this result. Values range from 0.0 (completely
	// unstable) to 1.0 (completely stable and final). The default of 0.0 is a
	// sentinel value indicating `stability` was not set.
	Stability float32 `protobuf:"fixed32,2,opt,name=stability,proto3" json:"stability,omitempty"`
}

func (x *SpeechRecognitionResult) Reset() {
	*x = SpeechRecognitionResult{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *SpeechRecognitionResult) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*SpeechRecognitionResult) ProtoMessage() {}

func (x *SpeechRecognitionResult) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[12]
	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 SpeechRecognitionResult.ProtoReflect.Descriptor instead.
func (*SpeechRecognitionResult) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{12}
}

func (x *SpeechRecognitionResult) GetTranscript() string {
	if x != nil {
		return x.Transcript
	}
	return ""
}

func (x *SpeechRecognitionResult) GetStability() float32 {
	if x != nil {
		return x.Stability
	}
	return 0
}

// The dialog state resulting from the user's query. Multiple of these messages
// may be received.
type DialogStateOut struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// *Output-only* Supplemental display text from the Assistant. This could be
	// the same as the speech spoken in `AssistResponse.audio_out` or it could
	// be some additional information which aids the user's understanding.
	SupplementalDisplayText string `protobuf:"bytes,1,opt,name=supplemental_display_text,json=supplementalDisplayText,proto3" json:"supplemental_display_text,omitempty"`
	// *Output-only* State information for the subsequent `Assist` RPC. This
	// value should be saved in the client and returned in the
	// [`DialogStateIn.conversation_state`](#dialogstatein) field with the next
	// `Assist` RPC. (The client does not need to interpret or otherwise use this
	// value.) This information should be saved across device reboots. However,
	// this value should be cleared (not saved in the client) during a
	// factory-default reset.
	ConversationState []byte `protobuf:"bytes,2,opt,name=conversation_state,json=conversationState,proto3" json:"conversation_state,omitempty"`
	// *Output-only* Specifies the mode of the microphone after this `Assist`
	// RPC is processed.
	MicrophoneMode DialogStateOut_MicrophoneMode `protobuf:"varint,3,opt,name=microphone_mode,json=microphoneMode,proto3,enum=google.assistant.embedded.v1alpha2.DialogStateOut_MicrophoneMode" json:"microphone_mode,omitempty"`
	// *Output-only* Updated volume level. The value will be 0 or omitted
	// (indicating no change) unless a voice command such as *Increase the volume*
	// or *Set volume level 4* was recognized, in which case the value will be
	// between 1 and 100 (corresponding to the new volume level of 1% to 100%).
	// Typically, a client should use this volume level when playing the
	// `audio_out` data, and retain this value as the current volume level and
	// supply it in the `AudioOutConfig` of the next `AssistRequest`. (Some
	// clients may also implement other ways to allow the current volume level to
	// be changed, for example, by providing a knob that the user can turn.)
	VolumePercentage int32 `protobuf:"varint,4,opt,name=volume_percentage,json=volumePercentage,proto3" json:"volume_percentage,omitempty"`
}

func (x *DialogStateOut) Reset() {
	*x = DialogStateOut{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DialogStateOut) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DialogStateOut) ProtoMessage() {}

func (x *DialogStateOut) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[13]
	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 DialogStateOut.ProtoReflect.Descriptor instead.
func (*DialogStateOut) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{13}
}

func (x *DialogStateOut) GetSupplementalDisplayText() string {
	if x != nil {
		return x.SupplementalDisplayText
	}
	return ""
}

func (x *DialogStateOut) GetConversationState() []byte {
	if x != nil {
		return x.ConversationState
	}
	return nil
}

func (x *DialogStateOut) GetMicrophoneMode() DialogStateOut_MicrophoneMode {
	if x != nil {
		return x.MicrophoneMode
	}
	return DialogStateOut_MICROPHONE_MODE_UNSPECIFIED
}

func (x *DialogStateOut) GetVolumePercentage() int32 {
	if x != nil {
		return x.VolumePercentage
	}
	return 0
}

// Debugging parameters for the current request.
type DebugConfig struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// When this field is set to true, the `debug_info` field in `AssistResponse`
	// may be populated. However it will significantly increase latency of
	// responses. Do not set this field true in production code.
	ReturnDebugInfo bool `protobuf:"varint,6,opt,name=return_debug_info,json=returnDebugInfo,proto3" json:"return_debug_info,omitempty"`
}

func (x *DebugConfig) Reset() {
	*x = DebugConfig{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DebugConfig) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DebugConfig) ProtoMessage() {}

func (x *DebugConfig) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[14]
	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 DebugConfig.ProtoReflect.Descriptor instead.
func (*DebugConfig) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{14}
}

func (x *DebugConfig) GetReturnDebugInfo() bool {
	if x != nil {
		return x.ReturnDebugInfo
	}
	return false
}

// There are three sources of locations. They are used with this precedence:
//
// 1. This `DeviceLocation`, which is primarily used for mobile devices with
//    GPS .
// 2. Location specified by the user during device setup; this is per-user, per
//    device. This location is used if `DeviceLocation` is not specified.
// 3. Inferred location based on IP address. This is used only if neither of the
//    above are specified.
type DeviceLocation struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Types that are assignable to Type:
	//	*DeviceLocation_Coordinates
	Type isDeviceLocation_Type `protobuf_oneof:"type"`
}

func (x *DeviceLocation) Reset() {
	*x = DeviceLocation{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DeviceLocation) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DeviceLocation) ProtoMessage() {}

func (x *DeviceLocation) ProtoReflect() protoreflect.Message {
	mi := &file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[15]
	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 DeviceLocation.ProtoReflect.Descriptor instead.
func (*DeviceLocation) Descriptor() ([]byte, []int) {
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP(), []int{15}
}

func (m *DeviceLocation) GetType() isDeviceLocation_Type {
	if m != nil {
		return m.Type
	}
	return nil
}

func (x *DeviceLocation) GetCoordinates() *latlng.LatLng {
	if x, ok := x.GetType().(*DeviceLocation_Coordinates); ok {
		return x.Coordinates
	}
	return nil
}

type isDeviceLocation_Type interface {
	isDeviceLocation_Type()
}

type DeviceLocation_Coordinates struct {
	// Latitude and longitude of device.
	Coordinates *latlng.LatLng `protobuf:"bytes,1,opt,name=coordinates,proto3,oneof"`
}

func (*DeviceLocation_Coordinates) isDeviceLocation_Type() {}

var File_google_assistant_embedded_v1alpha2_embedded_assistant_proto protoreflect.FileDescriptor

var file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDesc = []byte{
	0x0a, 0x3b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61,
	0x6e, 0x74, 0x2f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2f, 0x76, 0x31, 0x61, 0x6c,
	0x70, 0x68, 0x61, 0x32, 0x2f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x5f, 0x61, 0x73,
	0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x22, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e,
	0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
	0x32, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e,
	0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a,
	0x18, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6c, 0x61, 0x74,
	0x6c, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x0d, 0x41, 0x73,
	0x73, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4a, 0x0a, 0x06, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65,
	0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32,
	0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52,
	0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x75, 0x64, 0x69, 0x6f,
	0x5f, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x75, 0x64,
	0x69, 0x6f, 0x49, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0xac, 0x05, 0x0a,
	0x0e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x5b, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x3c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73,
	0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e,
	0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70,
	0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x49, 0x0a, 0x09,
	0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61,
	0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c,
	0x70, 0x68, 0x61, 0x32, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x52, 0x08, 0x61,
	0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x12, 0x4c, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x65, 0x65,
	0x6e, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65,
	0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32,
	0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74, 0x52, 0x09, 0x73, 0x63, 0x72, 0x65,
	0x65, 0x6e, 0x4f, 0x75, 0x74, 0x12, 0x55, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
	0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e,
	0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
	0x32, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c,
	0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x0e,
	0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73,
	0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64,
	0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68,
	0x52, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c,
	0x74, 0x52, 0x0d, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73,
	0x12, 0x5c, 0x0a, 0x10, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65,
	0x5f, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d,
	0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e,
	0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x52, 0x0e,
	0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x12, 0x4c,
	0x0a, 0x0a, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x08, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69,
	0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76,
	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66,
	0x6f, 0x52, 0x09, 0x64, 0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3d, 0x0a, 0x09,
	0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x45, 0x56, 0x45,
	0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46,
	0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f,
	0x55, 0x54, 0x54, 0x45, 0x52, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x22, 0x49, 0x0a, 0x09, 0x44,
	0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3c, 0x0a, 0x1b, 0x61, 0x6f, 0x67, 0x5f,
	0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x6f, 0x5f, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61,
	0x6e, 0x74, 0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61,
	0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61,
	0x6e, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0xd9, 0x04, 0x0a, 0x0c, 0x41, 0x73, 0x73, 0x69, 0x73,
	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5b, 0x0a, 0x0f, 0x61, 0x75, 0x64, 0x69, 0x6f,
	0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74,
	0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61,
	0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x49, 0x6e, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x0d, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x49, 0x6e, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x71, 0x75, 0x65,
	0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74,
	0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x5c, 0x0a, 0x10, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x6f,
	0x75, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61,
	0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c,
	0x70, 0x68, 0x61, 0x32, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0e, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a, 0x11, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x5f, 0x6f, 0x75,
	0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
	0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
	0x68, 0x61, 0x32, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e,
	0x66, 0x69, 0x67, 0x52, 0x0f, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x12, 0x59, 0x0a, 0x0f, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x5f, 0x73,
	0x74, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74,
	0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68,
	0x61, 0x32, 0x2e, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e,
	0x52, 0x0d, 0x64, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x12,
	0x55, 0x0a, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
	0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64,
	0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x44, 0x65, 0x76, 0x69,
	0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x52, 0x0a, 0x0c, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f,
	0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e,
	0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
	0x32, 0x2e, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0b, 0x64,
	0x65, 0x62, 0x75, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79,
	0x70, 0x65, 0x22, 0xd1, 0x01, 0x0a, 0x0d, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x49, 0x6e, 0x43, 0x6f,
	0x6e, 0x66, 0x69, 0x67, 0x12, 0x56, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64,
	0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x41, 0x75, 0x64, 0x69,
	0x6f, 0x49, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69,
	0x6e, 0x67, 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x11,
	0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x68, 0x65, 0x72, 0x74,
	0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52,
	0x61, 0x74, 0x65, 0x48, 0x65, 0x72, 0x74, 0x7a, 0x22, 0x3c, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f,
	0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47,
	0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c,
	0x0a, 0x08, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x31, 0x36, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04,
	0x46, 0x4c, 0x41, 0x43, 0x10, 0x02, 0x22, 0x90, 0x02, 0x0a, 0x0e, 0x41, 0x75, 0x64, 0x69, 0x6f,
	0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x57, 0x0a, 0x08, 0x65, 0x6e, 0x63,
	0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3b, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65,
	0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32,
	0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e,
	0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69,
	0x6e, 0x67, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x72, 0x61, 0x74,
	0x65, 0x5f, 0x68, 0x65, 0x72, 0x74, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73,
	0x61, 0x6d, 0x70, 0x6c, 0x65, 0x52, 0x61, 0x74, 0x65, 0x48, 0x65, 0x72, 0x74, 0x7a, 0x12, 0x2b,
	0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74,
	0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x6f, 0x6c, 0x75, 0x6d,
	0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x4c, 0x0a, 0x08, 0x45,
	0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x4e, 0x43, 0x4f, 0x44,
	0x49, 0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x49, 0x4e, 0x45, 0x41, 0x52, 0x31, 0x36, 0x10, 0x01, 0x12,
	0x07, 0x0a, 0x03, 0x4d, 0x50, 0x33, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x50, 0x55, 0x53,
	0x5f, 0x49, 0x4e, 0x5f, 0x4f, 0x47, 0x47, 0x10, 0x03, 0x22, 0xb3, 0x01, 0x0a, 0x0f, 0x53, 0x63,
	0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x5f, 0x0a,
	0x0b, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69,
	0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76,
	0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75,
	0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4d, 0x6f,
	0x64, 0x65, 0x52, 0x0a, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x3f,
	0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17,
	0x53, 0x43, 0x52, 0x45, 0x45, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50,
	0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4f, 0x46, 0x46,
	0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4c, 0x41, 0x59, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x22,
	0xf0, 0x01, 0x0a, 0x0d, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49,
	0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f,
	0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x63,
	0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65,
	0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x64,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x5b, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f,
	0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
	0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
	0x68, 0x61, 0x32, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x73, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x63, 0x6f, 0x6e,
	0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x11, 0x69, 0x73, 0x4e, 0x65, 0x77, 0x43, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69,
	0x6f, 0x6e, 0x22, 0x53, 0x0a, 0x0c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66,
	0x69, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12,
	0x26, 0x0a, 0x0f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f,
	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
	0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x08, 0x41, 0x75, 0x64, 0x69, 0x6f,
	0x4f, 0x75, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x64, 0x61, 0x74,
	0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x44, 0x61,
	0x74, 0x61, 0x22, 0x99, 0x01, 0x0a, 0x09, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74,
	0x12, 0x4c, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x34, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74,
	0x61, 0x6e, 0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61,
	0x6c, 0x70, 0x68, 0x61, 0x32, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x4f, 0x75, 0x74, 0x2e,
	0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12,
	0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61,
	0x74, 0x61, 0x22, 0x2a, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x12,
	0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
	0x45, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x01, 0x22, 0x3e,
	0x0a, 0x0c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e,
	0x0a, 0x13, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x5f, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x65, 0x76,
	0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4a, 0x73, 0x6f, 0x6e, 0x22, 0x57,
	0x0a, 0x17, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x52, 0x65, 0x63, 0x6f, 0x67, 0x6e, 0x69, 0x74,
	0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61,
	0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74,
	0x72, 0x61, 0x6e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x61,
	0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x73, 0x74,
	0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xf3, 0x02, 0x0a, 0x0e, 0x44, 0x69, 0x61, 0x6c,
	0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f, 0x75, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x75,
	0x70, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x69, 0x73, 0x70, 0x6c,
	0x61, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x73,
	0x75, 0x70, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x44, 0x69, 0x73, 0x70, 0x6c,
	0x61, 0x79, 0x54, 0x65, 0x78, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72,
	0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0c, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x61, 0x74, 0x69, 0x6f, 0x6e,
	0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x6a, 0x0a, 0x0f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68,
	0x6f, 0x6e, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x41,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
	0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
	0x68, 0x61, 0x32, 0x2e, 0x44, 0x69, 0x61, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4f,
	0x75, 0x74, 0x2e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4d, 0x6f, 0x64,
	0x65, 0x52, 0x0e, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4d, 0x6f, 0x64,
	0x65, 0x12, 0x2b, 0x0a, 0x11, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x63,
	0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x6f,
	0x6c, 0x75, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x5d,
	0x0a, 0x0e, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x4d, 0x6f, 0x64, 0x65,
	0x12, 0x1f, 0x0a, 0x1b, 0x4d, 0x49, 0x43, 0x52, 0x4f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x5f, 0x4d,
	0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
	0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x4d, 0x49, 0x43, 0x52, 0x4f,
	0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x49, 0x41, 0x4c, 0x4f,
	0x47, 0x5f, 0x46, 0x4f, 0x4c, 0x4c, 0x4f, 0x57, 0x5f, 0x4f, 0x4e, 0x10, 0x02, 0x22, 0x39, 0x0a,
	0x0b, 0x44, 0x65, 0x62, 0x75, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x11,
	0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x5f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x5f, 0x69, 0x6e, 0x66,
	0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x44,
	0x65, 0x62, 0x75, 0x67, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x51, 0x0a, 0x0e, 0x44, 0x65, 0x76, 0x69,
	0x63, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0b, 0x63, 0x6f,
	0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x13, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61,
	0x74, 0x4c, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x0b, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61,
	0x74, 0x65, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x32, 0x88, 0x01, 0x0a, 0x11,
	0x45, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
	0x74, 0x12, 0x73, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x12, 0x31, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e, 0x65,
	0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x32,
	0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e,
	0x74, 0x2e, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70,
	0x68, 0x61, 0x32, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
	0x73, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x8f, 0x01, 0x0a, 0x26, 0x63, 0x6f, 0x6d, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x2e,
	0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61,
	0x32, 0x42, 0x0e, 0x41, 0x73, 0x73, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74,
	0x6f, 0x50, 0x01, 0x5a, 0x4a, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61,
	0x6e, 0x67, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x61, 0x73, 0x73, 0x69, 0x73,
	0x74, 0x61, 0x6e, 0x74, 0x2f, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0x2f, 0x76, 0x31,
	0x61, 0x6c, 0x70, 0x68, 0x61, 0x32, 0x3b, 0x65, 0x6d, 0x62, 0x65, 0x64, 0x64, 0x65, 0x64, 0xa2,
	0x02, 0x06, 0x41, 0x53, 0x54, 0x53, 0x44, 0x4b, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescOnce sync.Once
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescData = file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDesc
)

func file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescGZIP() []byte {
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescOnce.Do(func() {
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescData)
	})
	return file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDescData
}

var file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes = make([]protoimpl.EnumInfo, 6)
var file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes = make([]protoimpl.MessageInfo, 16)
var file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_goTypes = []interface{}{
	(AssistResponse_EventType)(0),      // 0: google.assistant.embedded.v1alpha2.AssistResponse.EventType
	(AudioInConfig_Encoding)(0),        // 1: google.assistant.embedded.v1alpha2.AudioInConfig.Encoding
	(AudioOutConfig_Encoding)(0),       // 2: google.assistant.embedded.v1alpha2.AudioOutConfig.Encoding
	(ScreenOutConfig_ScreenMode)(0),    // 3: google.assistant.embedded.v1alpha2.ScreenOutConfig.ScreenMode
	(ScreenOut_Format)(0),              // 4: google.assistant.embedded.v1alpha2.ScreenOut.Format
	(DialogStateOut_MicrophoneMode)(0), // 5: google.assistant.embedded.v1alpha2.DialogStateOut.MicrophoneMode
	(*AssistRequest)(nil),              // 6: google.assistant.embedded.v1alpha2.AssistRequest
	(*AssistResponse)(nil),             // 7: google.assistant.embedded.v1alpha2.AssistResponse
	(*DebugInfo)(nil),                  // 8: google.assistant.embedded.v1alpha2.DebugInfo
	(*AssistConfig)(nil),               // 9: google.assistant.embedded.v1alpha2.AssistConfig
	(*AudioInConfig)(nil),              // 10: google.assistant.embedded.v1alpha2.AudioInConfig
	(*AudioOutConfig)(nil),             // 11: google.assistant.embedded.v1alpha2.AudioOutConfig
	(*ScreenOutConfig)(nil),            // 12: google.assistant.embedded.v1alpha2.ScreenOutConfig
	(*DialogStateIn)(nil),              // 13: google.assistant.embedded.v1alpha2.DialogStateIn
	(*DeviceConfig)(nil),               // 14: google.assistant.embedded.v1alpha2.DeviceConfig
	(*AudioOut)(nil),                   // 15: google.assistant.embedded.v1alpha2.AudioOut
	(*ScreenOut)(nil),                  // 16: google.assistant.embedded.v1alpha2.ScreenOut
	(*DeviceAction)(nil),               // 17: google.assistant.embedded.v1alpha2.DeviceAction
	(*SpeechRecognitionResult)(nil),    // 18: google.assistant.embedded.v1alpha2.SpeechRecognitionResult
	(*DialogStateOut)(nil),             // 19: google.assistant.embedded.v1alpha2.DialogStateOut
	(*DebugConfig)(nil),                // 20: google.assistant.embedded.v1alpha2.DebugConfig
	(*DeviceLocation)(nil),             // 21: google.assistant.embedded.v1alpha2.DeviceLocation
	(*latlng.LatLng)(nil),              // 22: google.type.LatLng
}
var file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_depIdxs = []int32{
	9,  // 0: google.assistant.embedded.v1alpha2.AssistRequest.config:type_name -> google.assistant.embedded.v1alpha2.AssistConfig
	0,  // 1: google.assistant.embedded.v1alpha2.AssistResponse.event_type:type_name -> google.assistant.embedded.v1alpha2.AssistResponse.EventType
	15, // 2: google.assistant.embedded.v1alpha2.AssistResponse.audio_out:type_name -> google.assistant.embedded.v1alpha2.AudioOut
	16, // 3: google.assistant.embedded.v1alpha2.AssistResponse.screen_out:type_name -> google.assistant.embedded.v1alpha2.ScreenOut
	17, // 4: google.assistant.embedded.v1alpha2.AssistResponse.device_action:type_name -> google.assistant.embedded.v1alpha2.DeviceAction
	18, // 5: google.assistant.embedded.v1alpha2.AssistResponse.speech_results:type_name -> google.assistant.embedded.v1alpha2.SpeechRecognitionResult
	19, // 6: google.assistant.embedded.v1alpha2.AssistResponse.dialog_state_out:type_name -> google.assistant.embedded.v1alpha2.DialogStateOut
	8,  // 7: google.assistant.embedded.v1alpha2.AssistResponse.debug_info:type_name -> google.assistant.embedded.v1alpha2.DebugInfo
	10, // 8: google.assistant.embedded.v1alpha2.AssistConfig.audio_in_config:type_name -> google.assistant.embedded.v1alpha2.AudioInConfig
	11, // 9: google.assistant.embedded.v1alpha2.AssistConfig.audio_out_config:type_name -> google.assistant.embedded.v1alpha2.AudioOutConfig
	12, // 10: google.assistant.embedded.v1alpha2.AssistConfig.screen_out_config:type_name -> google.assistant.embedded.v1alpha2.ScreenOutConfig
	13, // 11: google.assistant.embedded.v1alpha2.AssistConfig.dialog_state_in:type_name -> google.assistant.embedded.v1alpha2.DialogStateIn
	14, // 12: google.assistant.embedded.v1alpha2.AssistConfig.device_config:type_name -> google.assistant.embedded.v1alpha2.DeviceConfig
	20, // 13: google.assistant.embedded.v1alpha2.AssistConfig.debug_config:type_name -> google.assistant.embedded.v1alpha2.DebugConfig
	1,  // 14: google.assistant.embedded.v1alpha2.AudioInConfig.encoding:type_name -> google.assistant.embedded.v1alpha2.AudioInConfig.Encoding
	2,  // 15: google.assistant.embedded.v1alpha2.AudioOutConfig.encoding:type_name -> google.assistant.embedded.v1alpha2.AudioOutConfig.Encoding
	3,  // 16: google.assistant.embedded.v1alpha2.ScreenOutConfig.screen_mode:type_name -> google.assistant.embedded.v1alpha2.ScreenOutConfig.ScreenMode
	21, // 17: google.assistant.embedded.v1alpha2.DialogStateIn.device_location:type_name -> google.assistant.embedded.v1alpha2.DeviceLocation
	4,  // 18: google.assistant.embedded.v1alpha2.ScreenOut.format:type_name -> google.assistant.embedded.v1alpha2.ScreenOut.Format
	5,  // 19: google.assistant.embedded.v1alpha2.DialogStateOut.microphone_mode:type_name -> google.assistant.embedded.v1alpha2.DialogStateOut.MicrophoneMode
	22, // 20: google.assistant.embedded.v1alpha2.DeviceLocation.coordinates:type_name -> google.type.LatLng
	6,  // 21: google.assistant.embedded.v1alpha2.EmbeddedAssistant.Assist:input_type -> google.assistant.embedded.v1alpha2.AssistRequest
	7,  // 22: google.assistant.embedded.v1alpha2.EmbeddedAssistant.Assist:output_type -> google.assistant.embedded.v1alpha2.AssistResponse
	22, // [22:23] is the sub-list for method output_type
	21, // [21:22] is the sub-list for method input_type
	21, // [21:21] is the sub-list for extension type_name
	21, // [21:21] is the sub-list for extension extendee
	0,  // [0:21] is the sub-list for field type_name
}

func init() { file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_init() }
func file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_init() {
	if File_google_assistant_embedded_v1alpha2_embedded_assistant_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AssistRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AssistResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DebugInfo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AssistConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AudioInConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AudioOutConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ScreenOutConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DialogStateIn); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeviceConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AudioOut); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ScreenOut); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeviceAction); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*SpeechRecognitionResult); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DialogStateOut); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DebugConfig); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DeviceLocation); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*AssistRequest_Config)(nil),
		(*AssistRequest_AudioIn)(nil),
	}
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[3].OneofWrappers = []interface{}{
		(*AssistConfig_AudioInConfig)(nil),
		(*AssistConfig_TextQuery)(nil),
	}
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes[15].OneofWrappers = []interface{}{
		(*DeviceLocation_Coordinates)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDesc,
			NumEnums:      6,
			NumMessages:   16,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_goTypes,
		DependencyIndexes: file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_depIdxs,
		EnumInfos:         file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_enumTypes,
		MessageInfos:      file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_msgTypes,
	}.Build()
	File_google_assistant_embedded_v1alpha2_embedded_assistant_proto = out.File
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_rawDesc = nil
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_goTypes = nil
	file_google_assistant_embedded_v1alpha2_embedded_assistant_proto_depIdxs = nil
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// EmbeddedAssistantClient is the client API for EmbeddedAssistant service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type EmbeddedAssistantClient interface {
	// Initiates or continues a conversation with the embedded Assistant Service.
	// Each call performs one round-trip, sending an audio request to the service
	// and receiving the audio response. Uses bidirectional streaming to receive
	// results, such as the `END_OF_UTTERANCE` event, while sending audio.
	//
	// A conversation is one or more gRPC connections, each consisting of several
	// streamed requests and responses.
	// For example, the user says *Add to my shopping list* and the Assistant
	// responds *What do you want to add?*. The sequence of streamed requests and
	// responses in the first gRPC message could be:
	//
	// *   AssistRequest.config
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistResponse.event_type.END_OF_UTTERANCE
	// *   AssistResponse.speech_results.transcript "add to my shopping list"
	// *   AssistResponse.dialog_state_out.microphone_mode.DIALOG_FOLLOW_ON
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	//
	//
	// The user then says *bagels* and the Assistant responds
	// *OK, I've added bagels to your shopping list*. This is sent as another gRPC
	// connection call to the `Assist` method, again with streamed requests and
	// responses, such as:
	//
	// *   AssistRequest.config
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistResponse.event_type.END_OF_UTTERANCE
	// *   AssistResponse.dialog_state_out.microphone_mode.CLOSE_MICROPHONE
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	//
	// Although the precise order of responses is not guaranteed, sequential
	// `AssistResponse.audio_out` messages will always contain sequential portions
	// of audio.
	Assist(ctx context.Context, opts ...grpc.CallOption) (EmbeddedAssistant_AssistClient, error)
}

type embeddedAssistantClient struct {
	cc grpc.ClientConnInterface
}

func NewEmbeddedAssistantClient(cc grpc.ClientConnInterface) EmbeddedAssistantClient {
	return &embeddedAssistantClient{cc}
}

func (c *embeddedAssistantClient) Assist(ctx context.Context, opts ...grpc.CallOption) (EmbeddedAssistant_AssistClient, error) {
	stream, err := c.cc.NewStream(ctx, &_EmbeddedAssistant_serviceDesc.Streams[0], "/google.assistant.embedded.v1alpha2.EmbeddedAssistant/Assist", opts...)
	if err != nil {
		return nil, err
	}
	x := &embeddedAssistantAssistClient{stream}
	return x, nil
}

type EmbeddedAssistant_AssistClient interface {
	Send(*AssistRequest) error
	Recv() (*AssistResponse, error)
	grpc.ClientStream
}

type embeddedAssistantAssistClient struct {
	grpc.ClientStream
}

func (x *embeddedAssistantAssistClient) Send(m *AssistRequest) error {
	return x.ClientStream.SendMsg(m)
}

func (x *embeddedAssistantAssistClient) Recv() (*AssistResponse, error) {
	m := new(AssistResponse)
	if err := x.ClientStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

// EmbeddedAssistantServer is the server API for EmbeddedAssistant service.
type EmbeddedAssistantServer interface {
	// Initiates or continues a conversation with the embedded Assistant Service.
	// Each call performs one round-trip, sending an audio request to the service
	// and receiving the audio response. Uses bidirectional streaming to receive
	// results, such as the `END_OF_UTTERANCE` event, while sending audio.
	//
	// A conversation is one or more gRPC connections, each consisting of several
	// streamed requests and responses.
	// For example, the user says *Add to my shopping list* and the Assistant
	// responds *What do you want to add?*. The sequence of streamed requests and
	// responses in the first gRPC message could be:
	//
	// *   AssistRequest.config
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistResponse.event_type.END_OF_UTTERANCE
	// *   AssistResponse.speech_results.transcript "add to my shopping list"
	// *   AssistResponse.dialog_state_out.microphone_mode.DIALOG_FOLLOW_ON
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	//
	//
	// The user then says *bagels* and the Assistant responds
	// *OK, I've added bagels to your shopping list*. This is sent as another gRPC
	// connection call to the `Assist` method, again with streamed requests and
	// responses, such as:
	//
	// *   AssistRequest.config
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistRequest.audio_in
	// *   AssistResponse.event_type.END_OF_UTTERANCE
	// *   AssistResponse.dialog_state_out.microphone_mode.CLOSE_MICROPHONE
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	// *   AssistResponse.audio_out
	//
	// Although the precise order of responses is not guaranteed, sequential
	// `AssistResponse.audio_out` messages will always contain sequential portions
	// of audio.
	Assist(EmbeddedAssistant_AssistServer) error
}

// UnimplementedEmbeddedAssistantServer can be embedded to have forward compatible implementations.
type UnimplementedEmbeddedAssistantServer struct {
}

func (*UnimplementedEmbeddedAssistantServer) Assist(EmbeddedAssistant_AssistServer) error {
	return status.Errorf(codes.Unimplemented, "method Assist not implemented")
}

func RegisterEmbeddedAssistantServer(s *grpc.Server, srv EmbeddedAssistantServer) {
	s.RegisterService(&_EmbeddedAssistant_serviceDesc, srv)
}

func _EmbeddedAssistant_Assist_Handler(srv interface{}, stream grpc.ServerStream) error {
	return srv.(EmbeddedAssistantServer).Assist(&embeddedAssistantAssistServer{stream})
}

type EmbeddedAssistant_AssistServer interface {
	Send(*AssistResponse) error
	Recv() (*AssistRequest, error)
	grpc.ServerStream
}

type embeddedAssistantAssistServer struct {
	grpc.ServerStream
}

func (x *embeddedAssistantAssistServer) Send(m *AssistResponse) error {
	return x.ServerStream.SendMsg(m)
}

func (x *embeddedAssistantAssistServer) Recv() (*AssistRequest, error) {
	m := new(AssistRequest)
	if err := x.ServerStream.RecvMsg(m); err != nil {
		return nil, err
	}
	return m, nil
}

var _EmbeddedAssistant_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.assistant.embedded.v1alpha2.EmbeddedAssistant",
	HandlerType: (*EmbeddedAssistantServer)(nil),
	Methods:     []grpc.MethodDesc{},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "Assist",
			Handler:       _EmbeddedAssistant_Assist_Handler,
			ServerStreams: true,
			ClientStreams: true,
		},
	},
	Metadata: "google/assistant/embedded/v1alpha2/embedded_assistant.proto",
}
