// Code generated by protoc-gen-go. DO NOT EDIT.
// source: voltha_protos/openolt.proto

package openolt

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	config "github.com/opencord/voltha-protos/v5/go/ext/config"
	extension "github.com/opencord/voltha-protos/v5/go/extension"
	tech_profile "github.com/opencord/voltha-protos/v5/go/tech_profile"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type AlarmState int32

const (
	AlarmState_OFF AlarmState = 0
	AlarmState_ON  AlarmState = 1
)

var AlarmState_name = map[int32]string{
	0: "OFF",
	1: "ON",
}

var AlarmState_value = map[string]int32{
	"OFF": 0,
	"ON":  1,
}

func (x AlarmState) String() string {
	return proto.EnumName(AlarmState_name, int32(x))
}

func (AlarmState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{0}
}

//* activation fail reason.
type OnuIndication_ActivationFailReason int32

const (
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE                    OnuIndication_ActivationFailReason = 0
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_RANGING                 OnuIndication_ActivationFailReason = 1
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION OnuIndication_ActivationFailReason = 2
	OnuIndication_ONU_ACTIVATION_FAIL_REASON_LOS                     OnuIndication_ActivationFailReason = 3
	OnuIndication_ONU_ACTIVATION_FAIL_ONU_ALARM                      OnuIndication_ActivationFailReason = 4
	OnuIndication_ONU_ACTIVATION_FAIL_SWITCH_OVER                    OnuIndication_ActivationFailReason = 5
)

var OnuIndication_ActivationFailReason_name = map[int32]string{
	0: "ONU_ACTIVATION_FAIL_REASON_NONE",
	1: "ONU_ACTIVATION_FAIL_REASON_RANGING",
	2: "ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION",
	3: "ONU_ACTIVATION_FAIL_REASON_LOS",
	4: "ONU_ACTIVATION_FAIL_ONU_ALARM",
	5: "ONU_ACTIVATION_FAIL_SWITCH_OVER",
}

var OnuIndication_ActivationFailReason_value = map[string]int32{
	"ONU_ACTIVATION_FAIL_REASON_NONE":                    0,
	"ONU_ACTIVATION_FAIL_REASON_RANGING":                 1,
	"ONU_ACTIVATION_FAIL_REASON_PASSWORD_AUTHENTICATION": 2,
	"ONU_ACTIVATION_FAIL_REASON_LOS":                     3,
	"ONU_ACTIVATION_FAIL_ONU_ALARM":                      4,
	"ONU_ACTIVATION_FAIL_SWITCH_OVER":                    5,
}

func (x OnuIndication_ActivationFailReason) String() string {
	return proto.EnumName(OnuIndication_ActivationFailReason_name, int32(x))
}

func (OnuIndication_ActivationFailReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{5, 0}
}

type IntfOperIndication_PONResourceRanges_Pool_PoolType int32

const (
	IntfOperIndication_PONResourceRanges_Pool_ONU_ID     IntfOperIndication_PONResourceRanges_Pool_PoolType = 0
	IntfOperIndication_PONResourceRanges_Pool_ALLOC_ID   IntfOperIndication_PONResourceRanges_Pool_PoolType = 1
	IntfOperIndication_PONResourceRanges_Pool_GEMPORT_ID IntfOperIndication_PONResourceRanges_Pool_PoolType = 2
	IntfOperIndication_PONResourceRanges_Pool_FLOW_ID    IntfOperIndication_PONResourceRanges_Pool_PoolType = 3
)

var IntfOperIndication_PONResourceRanges_Pool_PoolType_name = map[int32]string{
	0: "ONU_ID",
	1: "ALLOC_ID",
	2: "GEMPORT_ID",
	3: "FLOW_ID",
}

var IntfOperIndication_PONResourceRanges_Pool_PoolType_value = map[string]int32{
	"ONU_ID":     0,
	"ALLOC_ID":   1,
	"GEMPORT_ID": 2,
	"FLOW_ID":    3,
}

func (x IntfOperIndication_PONResourceRanges_Pool_PoolType) String() string {
	return proto.EnumName(IntfOperIndication_PONResourceRanges_Pool_PoolType_name, int32(x))
}

func (IntfOperIndication_PONResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{6, 0, 0, 0}
}

type DeviceInfo_DeviceResourceRanges_Pool_PoolType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_ONU_ID     DeviceInfo_DeviceResourceRanges_Pool_PoolType = 0
	DeviceInfo_DeviceResourceRanges_Pool_ALLOC_ID   DeviceInfo_DeviceResourceRanges_Pool_PoolType = 1
	DeviceInfo_DeviceResourceRanges_Pool_GEMPORT_ID DeviceInfo_DeviceResourceRanges_Pool_PoolType = 2
	DeviceInfo_DeviceResourceRanges_Pool_FLOW_ID    DeviceInfo_DeviceResourceRanges_Pool_PoolType = 3
)

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_name = map[int32]string{
	0: "ONU_ID",
	1: "ALLOC_ID",
	2: "GEMPORT_ID",
	3: "FLOW_ID",
}

var DeviceInfo_DeviceResourceRanges_Pool_PoolType_value = map[string]int32{
	"ONU_ID":     0,
	"ALLOC_ID":   1,
	"GEMPORT_ID": 2,
	"FLOW_ID":    3,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_PoolType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_PoolType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 0}
}

type DeviceInfo_DeviceResourceRanges_Pool_SharingType int32

const (
	DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF           DeviceInfo_DeviceResourceRanges_Pool_SharingType = 0
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_ALL_TECH  DeviceInfo_DeviceResourceRanges_Pool_SharingType = 1
	DeviceInfo_DeviceResourceRanges_Pool_SHARED_BY_ALL_INTF_SAME_TECH DeviceInfo_DeviceResourceRanges_Pool_SharingType = 2
)

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_name = map[int32]string{
	0: "DEDICATED_PER_INTF",
	1: "SHARED_BY_ALL_INTF_ALL_TECH",
	2: "SHARED_BY_ALL_INTF_SAME_TECH",
}

var DeviceInfo_DeviceResourceRanges_Pool_SharingType_value = map[string]int32{
	"DEDICATED_PER_INTF":           0,
	"SHARED_BY_ALL_INTF_ALL_TECH":  1,
	"SHARED_BY_ALL_INTF_SAME_TECH": 2,
}

func (x DeviceInfo_DeviceResourceRanges_Pool_SharingType) String() string {
	return proto.EnumName(DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, int32(x))
}

func (DeviceInfo_DeviceResourceRanges_Pool_SharingType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0, 1}
}

type GroupMember_InterfaceType int32

const (
	GroupMember_PON           GroupMember_InterfaceType = 0
	GroupMember_EPON_1G_PATH  GroupMember_InterfaceType = 1
	GroupMember_EPON_10G_PATH GroupMember_InterfaceType = 2
)

var GroupMember_InterfaceType_name = map[int32]string{
	0: "PON",
	1: "EPON_1G_PATH",
	2: "EPON_10G_PATH",
}

var GroupMember_InterfaceType_value = map[string]int32{
	"PON":           0,
	"EPON_1G_PATH":  1,
	"EPON_10G_PATH": 2,
}

func (x GroupMember_InterfaceType) String() string {
	return proto.EnumName(GroupMember_InterfaceType_name, int32(x))
}

func (GroupMember_InterfaceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{46, 0}
}

type Group_GroupMembersCommand int32

const (
	Group_ADD_MEMBERS    Group_GroupMembersCommand = 0
	Group_REMOVE_MEMBERS Group_GroupMembersCommand = 1
	Group_SET_MEMBERS    Group_GroupMembersCommand = 2
)

var Group_GroupMembersCommand_name = map[int32]string{
	0: "ADD_MEMBERS",
	1: "REMOVE_MEMBERS",
	2: "SET_MEMBERS",
}

var Group_GroupMembersCommand_value = map[string]int32{
	"ADD_MEMBERS":    0,
	"REMOVE_MEMBERS": 1,
	"SET_MEMBERS":    2,
}

func (x Group_GroupMembersCommand) String() string {
	return proto.EnumName(Group_GroupMembersCommand_name, int32(x))
}

func (Group_GroupMembersCommand) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{47, 0}
}

type PonRxPowerData_RssiMeasurementFailReason int32

const (
	PonRxPowerData_FAIL_REASON_NONE         PonRxPowerData_RssiMeasurementFailReason = 0
	PonRxPowerData_FAIL_REASON_NO_DELIMITER PonRxPowerData_RssiMeasurementFailReason = 1
	PonRxPowerData_FAIL_REASON_NO_ACCESS    PonRxPowerData_RssiMeasurementFailReason = 2
)

var PonRxPowerData_RssiMeasurementFailReason_name = map[int32]string{
	0: "FAIL_REASON_NONE",
	1: "FAIL_REASON_NO_DELIMITER",
	2: "FAIL_REASON_NO_ACCESS",
}

var PonRxPowerData_RssiMeasurementFailReason_value = map[string]int32{
	"FAIL_REASON_NONE":         0,
	"FAIL_REASON_NO_DELIMITER": 1,
	"FAIL_REASON_NO_ACCESS":    2,
}

func (x PonRxPowerData_RssiMeasurementFailReason) String() string {
	return proto.EnumName(PonRxPowerData_RssiMeasurementFailReason_name, int32(x))
}

func (PonRxPowerData_RssiMeasurementFailReason) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{49, 0}
}

type OnuObjectData_OnuObjState int32

const (
	OnuObjectData_NOT_CONFIGURED OnuObjectData_OnuObjState = 0
	OnuObjectData_ACTIVE         OnuObjectData_OnuObjState = 1
	OnuObjectData_INACTIVE       OnuObjectData_OnuObjState = 2
)

var OnuObjectData_OnuObjState_name = map[int32]string{
	0: "NOT_CONFIGURED",
	1: "ACTIVE",
	2: "INACTIVE",
}

var OnuObjectData_OnuObjState_value = map[string]int32{
	"NOT_CONFIGURED": 0,
	"ACTIVE":         1,
	"INACTIVE":       2,
}

func (x OnuObjectData_OnuObjState) String() string {
	return proto.EnumName(OnuObjectData_OnuObjState_name, int32(x))
}

func (OnuObjectData_OnuObjState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{50, 0}
}

type Indication struct {
	// Types that are valid to be assigned to Data:
	//	*Indication_OltInd
	//	*Indication_IntfInd
	//	*Indication_IntfOperInd
	//	*Indication_OnuDiscInd
	//	*Indication_OnuInd
	//	*Indication_OmciInd
	//	*Indication_PktInd
	//	*Indication_PortStats
	//	*Indication_FlowStats
	//	*Indication_AlarmInd
	Data                 isIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Indication) Reset()         { *m = Indication{} }
func (m *Indication) String() string { return proto.CompactTextString(m) }
func (*Indication) ProtoMessage()    {}
func (*Indication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{0}
}

func (m *Indication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Indication.Unmarshal(m, b)
}
func (m *Indication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Indication.Marshal(b, m, deterministic)
}
func (m *Indication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Indication.Merge(m, src)
}
func (m *Indication) XXX_Size() int {
	return xxx_messageInfo_Indication.Size(m)
}
func (m *Indication) XXX_DiscardUnknown() {
	xxx_messageInfo_Indication.DiscardUnknown(m)
}

var xxx_messageInfo_Indication proto.InternalMessageInfo

type isIndication_Data interface {
	isIndication_Data()
}

type Indication_OltInd struct {
	OltInd *OltIndication `protobuf:"bytes,1,opt,name=olt_ind,json=oltInd,proto3,oneof"`
}

type Indication_IntfInd struct {
	IntfInd *IntfIndication `protobuf:"bytes,2,opt,name=intf_ind,json=intfInd,proto3,oneof"`
}

type Indication_IntfOperInd struct {
	IntfOperInd *IntfOperIndication `protobuf:"bytes,3,opt,name=intf_oper_ind,json=intfOperInd,proto3,oneof"`
}

type Indication_OnuDiscInd struct {
	OnuDiscInd *OnuDiscIndication `protobuf:"bytes,4,opt,name=onu_disc_ind,json=onuDiscInd,proto3,oneof"`
}

type Indication_OnuInd struct {
	OnuInd *OnuIndication `protobuf:"bytes,5,opt,name=onu_ind,json=onuInd,proto3,oneof"`
}

type Indication_OmciInd struct {
	OmciInd *OmciIndication `protobuf:"bytes,6,opt,name=omci_ind,json=omciInd,proto3,oneof"`
}

type Indication_PktInd struct {
	PktInd *PacketIndication `protobuf:"bytes,7,opt,name=pkt_ind,json=pktInd,proto3,oneof"`
}

type Indication_PortStats struct {
	PortStats *PortStatistics `protobuf:"bytes,8,opt,name=port_stats,json=portStats,proto3,oneof"`
}

type Indication_FlowStats struct {
	FlowStats *FlowStatistics `protobuf:"bytes,9,opt,name=flow_stats,json=flowStats,proto3,oneof"`
}

type Indication_AlarmInd struct {
	AlarmInd *AlarmIndication `protobuf:"bytes,10,opt,name=alarm_ind,json=alarmInd,proto3,oneof"`
}

func (*Indication_OltInd) isIndication_Data() {}

func (*Indication_IntfInd) isIndication_Data() {}

func (*Indication_IntfOperInd) isIndication_Data() {}

func (*Indication_OnuDiscInd) isIndication_Data() {}

func (*Indication_OnuInd) isIndication_Data() {}

func (*Indication_OmciInd) isIndication_Data() {}

func (*Indication_PktInd) isIndication_Data() {}

func (*Indication_PortStats) isIndication_Data() {}

func (*Indication_FlowStats) isIndication_Data() {}

func (*Indication_AlarmInd) isIndication_Data() {}

func (m *Indication) GetData() isIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *Indication) GetOltInd() *OltIndication {
	if x, ok := m.GetData().(*Indication_OltInd); ok {
		return x.OltInd
	}
	return nil
}

func (m *Indication) GetIntfInd() *IntfIndication {
	if x, ok := m.GetData().(*Indication_IntfInd); ok {
		return x.IntfInd
	}
	return nil
}

func (m *Indication) GetIntfOperInd() *IntfOperIndication {
	if x, ok := m.GetData().(*Indication_IntfOperInd); ok {
		return x.IntfOperInd
	}
	return nil
}

func (m *Indication) GetOnuDiscInd() *OnuDiscIndication {
	if x, ok := m.GetData().(*Indication_OnuDiscInd); ok {
		return x.OnuDiscInd
	}
	return nil
}

func (m *Indication) GetOnuInd() *OnuIndication {
	if x, ok := m.GetData().(*Indication_OnuInd); ok {
		return x.OnuInd
	}
	return nil
}

func (m *Indication) GetOmciInd() *OmciIndication {
	if x, ok := m.GetData().(*Indication_OmciInd); ok {
		return x.OmciInd
	}
	return nil
}

func (m *Indication) GetPktInd() *PacketIndication {
	if x, ok := m.GetData().(*Indication_PktInd); ok {
		return x.PktInd
	}
	return nil
}

func (m *Indication) GetPortStats() *PortStatistics {
	if x, ok := m.GetData().(*Indication_PortStats); ok {
		return x.PortStats
	}
	return nil
}

func (m *Indication) GetFlowStats() *FlowStatistics {
	if x, ok := m.GetData().(*Indication_FlowStats); ok {
		return x.FlowStats
	}
	return nil
}

func (m *Indication) GetAlarmInd() *AlarmIndication {
	if x, ok := m.GetData().(*Indication_AlarmInd); ok {
		return x.AlarmInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Indication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Indication_OltInd)(nil),
		(*Indication_IntfInd)(nil),
		(*Indication_IntfOperInd)(nil),
		(*Indication_OnuDiscInd)(nil),
		(*Indication_OnuInd)(nil),
		(*Indication_OmciInd)(nil),
		(*Indication_PktInd)(nil),
		(*Indication_PortStats)(nil),
		(*Indication_FlowStats)(nil),
		(*Indication_AlarmInd)(nil),
	}
}

type AlarmIndication struct {
	// Types that are valid to be assigned to Data:
	//	*AlarmIndication_LosInd
	//	*AlarmIndication_DyingGaspInd
	//	*AlarmIndication_OnuAlarmInd
	//	*AlarmIndication_OnuStartupFailInd
	//	*AlarmIndication_OnuSignalDegradeInd
	//	*AlarmIndication_OnuDriftOfWindowInd
	//	*AlarmIndication_OnuLossOmciInd
	//	*AlarmIndication_OnuSignalsFailInd
	//	*AlarmIndication_OnuTiwiInd
	//	*AlarmIndication_OnuActivationFailInd
	//	*AlarmIndication_OnuProcessingErrorInd
	//	*AlarmIndication_OnuLossOfSyncFailInd
	//	*AlarmIndication_OnuItuPonStatsInd
	//	*AlarmIndication_OnuDeactivationFailureInd
	//	*AlarmIndication_OnuRemoteDefectInd
	//	*AlarmIndication_OnuLossGemDelineationInd
	//	*AlarmIndication_OnuPhysicalEquipmentErrorInd
	//	*AlarmIndication_OnuLossOfAckInd
	//	*AlarmIndication_OnuDiffReachExceededInd
	Data                 isAlarmIndication_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *AlarmIndication) Reset()         { *m = AlarmIndication{} }
func (m *AlarmIndication) String() string { return proto.CompactTextString(m) }
func (*AlarmIndication) ProtoMessage()    {}
func (*AlarmIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{1}
}

func (m *AlarmIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_AlarmIndication.Unmarshal(m, b)
}
func (m *AlarmIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_AlarmIndication.Marshal(b, m, deterministic)
}
func (m *AlarmIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_AlarmIndication.Merge(m, src)
}
func (m *AlarmIndication) XXX_Size() int {
	return xxx_messageInfo_AlarmIndication.Size(m)
}
func (m *AlarmIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_AlarmIndication.DiscardUnknown(m)
}

var xxx_messageInfo_AlarmIndication proto.InternalMessageInfo

type isAlarmIndication_Data interface {
	isAlarmIndication_Data()
}

type AlarmIndication_LosInd struct {
	LosInd *LosIndication `protobuf:"bytes,1,opt,name=los_ind,json=losInd,proto3,oneof"`
}

type AlarmIndication_DyingGaspInd struct {
	DyingGaspInd *DyingGaspIndication `protobuf:"bytes,2,opt,name=dying_gasp_ind,json=dyingGaspInd,proto3,oneof"`
}

type AlarmIndication_OnuAlarmInd struct {
	OnuAlarmInd *OnuAlarmIndication `protobuf:"bytes,3,opt,name=onu_alarm_ind,json=onuAlarmInd,proto3,oneof"`
}

type AlarmIndication_OnuStartupFailInd struct {
	OnuStartupFailInd *OnuStartupFailureIndication `protobuf:"bytes,4,opt,name=onu_startup_fail_ind,json=onuStartupFailInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalDegradeInd struct {
	OnuSignalDegradeInd *OnuSignalDegradeIndication `protobuf:"bytes,5,opt,name=onu_signal_degrade_ind,json=onuSignalDegradeInd,proto3,oneof"`
}

type AlarmIndication_OnuDriftOfWindowInd struct {
	OnuDriftOfWindowInd *OnuDriftOfWindowIndication `protobuf:"bytes,6,opt,name=onu_drift_of_window_ind,json=onuDriftOfWindowInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOmciInd struct {
	OnuLossOmciInd *OnuLossOfOmciChannelIndication `protobuf:"bytes,7,opt,name=onu_loss_omci_ind,json=onuLossOmciInd,proto3,oneof"`
}

type AlarmIndication_OnuSignalsFailInd struct {
	OnuSignalsFailInd *OnuSignalsFailureIndication `protobuf:"bytes,8,opt,name=onu_signals_fail_ind,json=onuSignalsFailInd,proto3,oneof"`
}

type AlarmIndication_OnuTiwiInd struct {
	OnuTiwiInd *OnuTransmissionInterferenceWarning `protobuf:"bytes,9,opt,name=onu_tiwi_ind,json=onuTiwiInd,proto3,oneof"`
}

type AlarmIndication_OnuActivationFailInd struct {
	OnuActivationFailInd *OnuActivationFailureIndication `protobuf:"bytes,10,opt,name=onu_activation_fail_ind,json=onuActivationFailInd,proto3,oneof"`
}

type AlarmIndication_OnuProcessingErrorInd struct {
	OnuProcessingErrorInd *OnuProcessingErrorIndication `protobuf:"bytes,11,opt,name=onu_processing_error_ind,json=onuProcessingErrorInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOfSyncFailInd struct {
	OnuLossOfSyncFailInd *OnuLossOfKeySyncFailureIndication `protobuf:"bytes,12,opt,name=onu_loss_of_sync_fail_ind,json=onuLossOfSyncFailInd,proto3,oneof"`
}

type AlarmIndication_OnuItuPonStatsInd struct {
	OnuItuPonStatsInd *OnuItuPonStatsIndication `protobuf:"bytes,13,opt,name=onu_itu_pon_stats_ind,json=onuItuPonStatsInd,proto3,oneof"`
}

type AlarmIndication_OnuDeactivationFailureInd struct {
	OnuDeactivationFailureInd *OnuDeactivationFailureIndication `protobuf:"bytes,14,opt,name=onu_deactivation_failure_ind,json=onuDeactivationFailureInd,proto3,oneof"`
}

type AlarmIndication_OnuRemoteDefectInd struct {
	OnuRemoteDefectInd *OnuRemoteDefectIndication `protobuf:"bytes,15,opt,name=onu_remote_defect_ind,json=onuRemoteDefectInd,proto3,oneof"`
}

type AlarmIndication_OnuLossGemDelineationInd struct {
	OnuLossGemDelineationInd *OnuLossOfGEMChannelDelineationIndication `protobuf:"bytes,16,opt,name=onu_loss_gem_delineation_ind,json=onuLossGemDelineationInd,proto3,oneof"`
}

type AlarmIndication_OnuPhysicalEquipmentErrorInd struct {
	OnuPhysicalEquipmentErrorInd *OnuPhysicalEquipmentErrorIndication `protobuf:"bytes,17,opt,name=onu_physical_equipment_error_ind,json=onuPhysicalEquipmentErrorInd,proto3,oneof"`
}

type AlarmIndication_OnuLossOfAckInd struct {
	OnuLossOfAckInd *OnuLossOfAcknowledgementIndication `protobuf:"bytes,18,opt,name=onu_loss_of_ack_ind,json=onuLossOfAckInd,proto3,oneof"`
}

type AlarmIndication_OnuDiffReachExceededInd struct {
	OnuDiffReachExceededInd *OnuDifferentialReachExceededIndication `protobuf:"bytes,19,opt,name=onu_diff_reach_exceeded_ind,json=onuDiffReachExceededInd,proto3,oneof"`
}

func (*AlarmIndication_LosInd) isAlarmIndication_Data() {}

func (*AlarmIndication_DyingGaspInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuAlarmInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuStartupFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalDegradeInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDriftOfWindowInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOmciInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuSignalsFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuTiwiInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuActivationFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuProcessingErrorInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOfSyncFailInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuItuPonStatsInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDeactivationFailureInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuRemoteDefectInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossGemDelineationInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuPhysicalEquipmentErrorInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuLossOfAckInd) isAlarmIndication_Data() {}

func (*AlarmIndication_OnuDiffReachExceededInd) isAlarmIndication_Data() {}

func (m *AlarmIndication) GetData() isAlarmIndication_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *AlarmIndication) GetLosInd() *LosIndication {
	if x, ok := m.GetData().(*AlarmIndication_LosInd); ok {
		return x.LosInd
	}
	return nil
}

func (m *AlarmIndication) GetDyingGaspInd() *DyingGaspIndication {
	if x, ok := m.GetData().(*AlarmIndication_DyingGaspInd); ok {
		return x.DyingGaspInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuAlarmInd() *OnuAlarmIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuAlarmInd); ok {
		return x.OnuAlarmInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuStartupFailInd() *OnuStartupFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuStartupFailInd); ok {
		return x.OnuStartupFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalDegradeInd() *OnuSignalDegradeIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalDegradeInd); ok {
		return x.OnuSignalDegradeInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDriftOfWindowInd() *OnuDriftOfWindowIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDriftOfWindowInd); ok {
		return x.OnuDriftOfWindowInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOmciInd() *OnuLossOfOmciChannelIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOmciInd); ok {
		return x.OnuLossOmciInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuSignalsFailInd() *OnuSignalsFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuSignalsFailInd); ok {
		return x.OnuSignalsFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuTiwiInd() *OnuTransmissionInterferenceWarning {
	if x, ok := m.GetData().(*AlarmIndication_OnuTiwiInd); ok {
		return x.OnuTiwiInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuActivationFailInd() *OnuActivationFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuActivationFailInd); ok {
		return x.OnuActivationFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuProcessingErrorInd() *OnuProcessingErrorIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuProcessingErrorInd); ok {
		return x.OnuProcessingErrorInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOfSyncFailInd() *OnuLossOfKeySyncFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfSyncFailInd); ok {
		return x.OnuLossOfSyncFailInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuItuPonStatsInd() *OnuItuPonStatsIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuItuPonStatsInd); ok {
		return x.OnuItuPonStatsInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDeactivationFailureInd() *OnuDeactivationFailureIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDeactivationFailureInd); ok {
		return x.OnuDeactivationFailureInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuRemoteDefectInd() *OnuRemoteDefectIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuRemoteDefectInd); ok {
		return x.OnuRemoteDefectInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossGemDelineationInd() *OnuLossOfGEMChannelDelineationIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossGemDelineationInd); ok {
		return x.OnuLossGemDelineationInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuPhysicalEquipmentErrorInd() *OnuPhysicalEquipmentErrorIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuPhysicalEquipmentErrorInd); ok {
		return x.OnuPhysicalEquipmentErrorInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuLossOfAckInd() *OnuLossOfAcknowledgementIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuLossOfAckInd); ok {
		return x.OnuLossOfAckInd
	}
	return nil
}

func (m *AlarmIndication) GetOnuDiffReachExceededInd() *OnuDifferentialReachExceededIndication {
	if x, ok := m.GetData().(*AlarmIndication_OnuDiffReachExceededInd); ok {
		return x.OnuDiffReachExceededInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*AlarmIndication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*AlarmIndication_LosInd)(nil),
		(*AlarmIndication_DyingGaspInd)(nil),
		(*AlarmIndication_OnuAlarmInd)(nil),
		(*AlarmIndication_OnuStartupFailInd)(nil),
		(*AlarmIndication_OnuSignalDegradeInd)(nil),
		(*AlarmIndication_OnuDriftOfWindowInd)(nil),
		(*AlarmIndication_OnuLossOmciInd)(nil),
		(*AlarmIndication_OnuSignalsFailInd)(nil),
		(*AlarmIndication_OnuTiwiInd)(nil),
		(*AlarmIndication_OnuActivationFailInd)(nil),
		(*AlarmIndication_OnuProcessingErrorInd)(nil),
		(*AlarmIndication_OnuLossOfSyncFailInd)(nil),
		(*AlarmIndication_OnuItuPonStatsInd)(nil),
		(*AlarmIndication_OnuDeactivationFailureInd)(nil),
		(*AlarmIndication_OnuRemoteDefectInd)(nil),
		(*AlarmIndication_OnuLossGemDelineationInd)(nil),
		(*AlarmIndication_OnuPhysicalEquipmentErrorInd)(nil),
		(*AlarmIndication_OnuLossOfAckInd)(nil),
		(*AlarmIndication_OnuDiffReachExceededInd)(nil),
	}
}

type OltIndication struct {
	OperState            string   `protobuf:"bytes,1,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OltIndication) Reset()         { *m = OltIndication{} }
func (m *OltIndication) String() string { return proto.CompactTextString(m) }
func (*OltIndication) ProtoMessage()    {}
func (*OltIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{2}
}

func (m *OltIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OltIndication.Unmarshal(m, b)
}
func (m *OltIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OltIndication.Marshal(b, m, deterministic)
}
func (m *OltIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OltIndication.Merge(m, src)
}
func (m *OltIndication) XXX_Size() int {
	return xxx_messageInfo_OltIndication.Size(m)
}
func (m *OltIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OltIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OltIndication proto.InternalMessageInfo

func (m *OltIndication) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

type IntfIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string   `protobuf:"bytes,2,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *IntfIndication) Reset()         { *m = IntfIndication{} }
func (m *IntfIndication) String() string { return proto.CompactTextString(m) }
func (*IntfIndication) ProtoMessage()    {}
func (*IntfIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{3}
}

func (m *IntfIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntfIndication.Unmarshal(m, b)
}
func (m *IntfIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntfIndication.Marshal(b, m, deterministic)
}
func (m *IntfIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntfIndication.Merge(m, src)
}
func (m *IntfIndication) XXX_Size() int {
	return xxx_messageInfo_IntfIndication.Size(m)
}
func (m *IntfIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_IntfIndication.DiscardUnknown(m)
}

var xxx_messageInfo_IntfIndication proto.InternalMessageInfo

func (m *IntfIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *IntfIndication) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

type OnuDiscIndication struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,2,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *OnuDiscIndication) Reset()         { *m = OnuDiscIndication{} }
func (m *OnuDiscIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDiscIndication) ProtoMessage()    {}
func (*OnuDiscIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{4}
}

func (m *OnuDiscIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuDiscIndication.Unmarshal(m, b)
}
func (m *OnuDiscIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuDiscIndication.Marshal(b, m, deterministic)
}
func (m *OnuDiscIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuDiscIndication.Merge(m, src)
}
func (m *OnuDiscIndication) XXX_Size() int {
	return xxx_messageInfo_OnuDiscIndication.Size(m)
}
func (m *OnuDiscIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuDiscIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuDiscIndication proto.InternalMessageInfo

func (m *OnuDiscIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDiscIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

type OnuIndication struct {
	IntfId               uint32                             `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32                             `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	OperState            string                             `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	AdminState           string                             `protobuf:"bytes,5,opt,name=admin_state,json=adminState,proto3" json:"admin_state,omitempty"`
	SerialNumber         *SerialNumber                      `protobuf:"bytes,4,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	FailReason           OnuIndication_ActivationFailReason `protobuf:"varint,6,opt,name=fail_reason,json=failReason,proto3,enum=openolt.OnuIndication_ActivationFailReason" json:"fail_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *OnuIndication) Reset()         { *m = OnuIndication{} }
func (m *OnuIndication) String() string { return proto.CompactTextString(m) }
func (*OnuIndication) ProtoMessage()    {}
func (*OnuIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{5}
}

func (m *OnuIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuIndication.Unmarshal(m, b)
}
func (m *OnuIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuIndication.Marshal(b, m, deterministic)
}
func (m *OnuIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuIndication.Merge(m, src)
}
func (m *OnuIndication) XXX_Size() int {
	return xxx_messageInfo_OnuIndication.Size(m)
}
func (m *OnuIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuIndication proto.InternalMessageInfo

func (m *OnuIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuIndication) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *OnuIndication) GetAdminState() string {
	if m != nil {
		return m.AdminState
	}
	return ""
}

func (m *OnuIndication) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

func (m *OnuIndication) GetFailReason() OnuIndication_ActivationFailReason {
	if m != nil {
		return m.FailReason
	}
	return OnuIndication_ONU_ACTIVATION_FAIL_REASON_NONE
}

type IntfOperIndication struct {
	Type                 string                                `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
	IntfId               uint32                                `protobuf:"fixed32,2,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OperState            string                                `protobuf:"bytes,3,opt,name=oper_state,json=operState,proto3" json:"oper_state,omitempty"`
	Speed                uint32                                `protobuf:"fixed32,4,opt,name=speed,proto3" json:"speed,omitempty"`
	Technology           string                                `protobuf:"bytes,5,opt,name=technology,proto3" json:"technology,omitempty"`
	Ranges               *IntfOperIndication_PONResourceRanges `protobuf:"bytes,6,opt,name=ranges,proto3" json:"ranges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                              `json:"-"`
	XXX_unrecognized     []byte                                `json:"-"`
	XXX_sizecache        int32                                 `json:"-"`
}

func (m *IntfOperIndication) Reset()         { *m = IntfOperIndication{} }
func (m *IntfOperIndication) String() string { return proto.CompactTextString(m) }
func (*IntfOperIndication) ProtoMessage()    {}
func (*IntfOperIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{6}
}

func (m *IntfOperIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntfOperIndication.Unmarshal(m, b)
}
func (m *IntfOperIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntfOperIndication.Marshal(b, m, deterministic)
}
func (m *IntfOperIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntfOperIndication.Merge(m, src)
}
func (m *IntfOperIndication) XXX_Size() int {
	return xxx_messageInfo_IntfOperIndication.Size(m)
}
func (m *IntfOperIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_IntfOperIndication.DiscardUnknown(m)
}

var xxx_messageInfo_IntfOperIndication proto.InternalMessageInfo

func (m *IntfOperIndication) GetType() string {
	if m != nil {
		return m.Type
	}
	return ""
}

func (m *IntfOperIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *IntfOperIndication) GetOperState() string {
	if m != nil {
		return m.OperState
	}
	return ""
}

func (m *IntfOperIndication) GetSpeed() uint32 {
	if m != nil {
		return m.Speed
	}
	return 0
}

func (m *IntfOperIndication) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *IntfOperIndication) GetRanges() *IntfOperIndication_PONResourceRanges {
	if m != nil {
		return m.Ranges
	}
	return nil
}

type IntfOperIndication_PONResourceRanges struct {
	Pools                []*IntfOperIndication_PONResourceRanges_Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                     `json:"-"`
	XXX_unrecognized     []byte                                       `json:"-"`
	XXX_sizecache        int32                                        `json:"-"`
}

func (m *IntfOperIndication_PONResourceRanges) Reset()         { *m = IntfOperIndication_PONResourceRanges{} }
func (m *IntfOperIndication_PONResourceRanges) String() string { return proto.CompactTextString(m) }
func (*IntfOperIndication_PONResourceRanges) ProtoMessage()    {}
func (*IntfOperIndication_PONResourceRanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{6, 0}
}

func (m *IntfOperIndication_PONResourceRanges) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Unmarshal(m, b)
}
func (m *IntfOperIndication_PONResourceRanges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Marshal(b, m, deterministic)
}
func (m *IntfOperIndication_PONResourceRanges) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntfOperIndication_PONResourceRanges.Merge(m, src)
}
func (m *IntfOperIndication_PONResourceRanges) XXX_Size() int {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges.Size(m)
}
func (m *IntfOperIndication_PONResourceRanges) XXX_DiscardUnknown() {
	xxx_messageInfo_IntfOperIndication_PONResourceRanges.DiscardUnknown(m)
}

var xxx_messageInfo_IntfOperIndication_PONResourceRanges proto.InternalMessageInfo

func (m *IntfOperIndication_PONResourceRanges) GetPools() []*IntfOperIndication_PONResourceRanges_Pool {
	if m != nil {
		return m.Pools
	}
	return nil
}

type IntfOperIndication_PONResourceRanges_Pool struct {
	Type                 IntfOperIndication_PONResourceRanges_Pool_PoolType `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.IntfOperIndication_PONResourceRanges_Pool_PoolType" json:"type,omitempty"`
	Start                uint32                                             `protobuf:"fixed32,3,opt,name=start,proto3" json:"start,omitempty"`
	End                  uint32                                             `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                           `json:"-"`
	XXX_unrecognized     []byte                                             `json:"-"`
	XXX_sizecache        int32                                              `json:"-"`
}

func (m *IntfOperIndication_PONResourceRanges_Pool) Reset() {
	*m = IntfOperIndication_PONResourceRanges_Pool{}
}
func (m *IntfOperIndication_PONResourceRanges_Pool) String() string {
	return proto.CompactTextString(m)
}
func (*IntfOperIndication_PONResourceRanges_Pool) ProtoMessage() {}
func (*IntfOperIndication_PONResourceRanges_Pool) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{6, 0, 0}
}

func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Unmarshal(m, b)
}
func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Marshal(b, m, deterministic)
}
func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Merge(m, src)
}
func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_Size() int {
	return xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.Size(m)
}
func (m *IntfOperIndication_PONResourceRanges_Pool) XXX_DiscardUnknown() {
	xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool.DiscardUnknown(m)
}

var xxx_messageInfo_IntfOperIndication_PONResourceRanges_Pool proto.InternalMessageInfo

func (m *IntfOperIndication_PONResourceRanges_Pool) GetType() IntfOperIndication_PONResourceRanges_Pool_PoolType {
	if m != nil {
		return m.Type
	}
	return IntfOperIndication_PONResourceRanges_Pool_ONU_ID
}

func (m *IntfOperIndication_PONResourceRanges_Pool) GetStart() uint32 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *IntfOperIndication_PONResourceRanges_Pool) GetEnd() uint32 {
	if m != nil {
		return m.End
	}
	return 0
}

type OmciIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OmciIndication) Reset()         { *m = OmciIndication{} }
func (m *OmciIndication) String() string { return proto.CompactTextString(m) }
func (*OmciIndication) ProtoMessage()    {}
func (*OmciIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{7}
}

func (m *OmciIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OmciIndication.Unmarshal(m, b)
}
func (m *OmciIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OmciIndication.Marshal(b, m, deterministic)
}
func (m *OmciIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OmciIndication.Merge(m, src)
}
func (m *OmciIndication) XXX_Size() int {
	return xxx_messageInfo_OmciIndication.Size(m)
}
func (m *OmciIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OmciIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OmciIndication proto.InternalMessageInfo

func (m *OmciIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OmciIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OmciIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type PacketIndication struct {
	IntfType             string   `protobuf:"bytes,5,opt,name=intf_type,json=intfType,proto3" json:"intf_type,omitempty"`
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,8,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	UniId                uint32   `protobuf:"fixed32,9,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,2,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	FlowId               uint32   `protobuf:"fixed32,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,6,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	Cookie               uint64   `protobuf:"fixed64,7,opt,name=cookie,proto3" json:"cookie,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,4,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PacketIndication) Reset()         { *m = PacketIndication{} }
func (m *PacketIndication) String() string { return proto.CompactTextString(m) }
func (*PacketIndication) ProtoMessage()    {}
func (*PacketIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{8}
}

func (m *PacketIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PacketIndication.Unmarshal(m, b)
}
func (m *PacketIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PacketIndication.Marshal(b, m, deterministic)
}
func (m *PacketIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PacketIndication.Merge(m, src)
}
func (m *PacketIndication) XXX_Size() int {
	return xxx_messageInfo_PacketIndication.Size(m)
}
func (m *PacketIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_PacketIndication.DiscardUnknown(m)
}

var xxx_messageInfo_PacketIndication proto.InternalMessageInfo

func (m *PacketIndication) GetIntfType() string {
	if m != nil {
		return m.IntfType
	}
	return ""
}

func (m *PacketIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PacketIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *PacketIndication) GetUniId() uint32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

func (m *PacketIndication) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *PacketIndication) GetFlowId() uint32 {
	if m != nil {
		return m.FlowId
	}
	return 0
}

func (m *PacketIndication) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *PacketIndication) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *PacketIndication) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type Interface struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Interface) Reset()         { *m = Interface{} }
func (m *Interface) String() string { return proto.CompactTextString(m) }
func (*Interface) ProtoMessage()    {}
func (*Interface) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{9}
}

func (m *Interface) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Interface.Unmarshal(m, b)
}
func (m *Interface) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Interface.Marshal(b, m, deterministic)
}
func (m *Interface) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Interface.Merge(m, src)
}
func (m *Interface) XXX_Size() int {
	return xxx_messageInfo_Interface.Size(m)
}
func (m *Interface) XXX_DiscardUnknown() {
	xxx_messageInfo_Interface.DiscardUnknown(m)
}

var xxx_messageInfo_Interface proto.InternalMessageInfo

func (m *Interface) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

type Heartbeat struct {
	HeartbeatSignature   uint32   `protobuf:"fixed32,1,opt,name=heartbeat_signature,json=heartbeatSignature,proto3" json:"heartbeat_signature,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Heartbeat) Reset()         { *m = Heartbeat{} }
func (m *Heartbeat) String() string { return proto.CompactTextString(m) }
func (*Heartbeat) ProtoMessage()    {}
func (*Heartbeat) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{10}
}

func (m *Heartbeat) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Heartbeat.Unmarshal(m, b)
}
func (m *Heartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Heartbeat.Marshal(b, m, deterministic)
}
func (m *Heartbeat) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Heartbeat.Merge(m, src)
}
func (m *Heartbeat) XXX_Size() int {
	return xxx_messageInfo_Heartbeat.Size(m)
}
func (m *Heartbeat) XXX_DiscardUnknown() {
	xxx_messageInfo_Heartbeat.DiscardUnknown(m)
}

var xxx_messageInfo_Heartbeat proto.InternalMessageInfo

func (m *Heartbeat) GetHeartbeatSignature() uint32 {
	if m != nil {
		return m.HeartbeatSignature
	}
	return 0
}

type Onu struct {
	IntfId               uint32        `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32        `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	SerialNumber         *SerialNumber `protobuf:"bytes,3,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	Pir                  uint32        `protobuf:"fixed32,4,opt,name=pir,proto3" json:"pir,omitempty"`
	OmccEncryption       bool          `protobuf:"varint,5,opt,name=omcc_encryption,json=omccEncryption,proto3" json:"omcc_encryption,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *Onu) Reset()         { *m = Onu{} }
func (m *Onu) String() string { return proto.CompactTextString(m) }
func (*Onu) ProtoMessage()    {}
func (*Onu) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{11}
}

func (m *Onu) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Onu.Unmarshal(m, b)
}
func (m *Onu) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Onu.Marshal(b, m, deterministic)
}
func (m *Onu) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Onu.Merge(m, src)
}
func (m *Onu) XXX_Size() int {
	return xxx_messageInfo_Onu.Size(m)
}
func (m *Onu) XXX_DiscardUnknown() {
	xxx_messageInfo_Onu.DiscardUnknown(m)
}

var xxx_messageInfo_Onu proto.InternalMessageInfo

func (m *Onu) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *Onu) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *Onu) GetSerialNumber() *SerialNumber {
	if m != nil {
		return m.SerialNumber
	}
	return nil
}

func (m *Onu) GetPir() uint32 {
	if m != nil {
		return m.Pir
	}
	return 0
}

func (m *Onu) GetOmccEncryption() bool {
	if m != nil {
		return m.OmccEncryption
	}
	return false
}

type OnuLogicalDistance struct {
	IntfId                 uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                  uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	LogicalOnuDistanceZero uint32   `protobuf:"fixed32,3,opt,name=logical_onu_distance_zero,json=logicalOnuDistanceZero,proto3" json:"logical_onu_distance_zero,omitempty"`
	LogicalOnuDistance     uint32   `protobuf:"fixed32,4,opt,name=logical_onu_distance,json=logicalOnuDistance,proto3" json:"logical_onu_distance,omitempty"`
	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
	XXX_unrecognized       []byte   `json:"-"`
	XXX_sizecache          int32    `json:"-"`
}

func (m *OnuLogicalDistance) Reset()         { *m = OnuLogicalDistance{} }
func (m *OnuLogicalDistance) String() string { return proto.CompactTextString(m) }
func (*OnuLogicalDistance) ProtoMessage()    {}
func (*OnuLogicalDistance) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{12}
}

func (m *OnuLogicalDistance) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuLogicalDistance.Unmarshal(m, b)
}
func (m *OnuLogicalDistance) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuLogicalDistance.Marshal(b, m, deterministic)
}
func (m *OnuLogicalDistance) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuLogicalDistance.Merge(m, src)
}
func (m *OnuLogicalDistance) XXX_Size() int {
	return xxx_messageInfo_OnuLogicalDistance.Size(m)
}
func (m *OnuLogicalDistance) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuLogicalDistance.DiscardUnknown(m)
}

var xxx_messageInfo_OnuLogicalDistance proto.InternalMessageInfo

func (m *OnuLogicalDistance) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuLogicalDistance) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuLogicalDistance) GetLogicalOnuDistanceZero() uint32 {
	if m != nil {
		return m.LogicalOnuDistanceZero
	}
	return 0
}

func (m *OnuLogicalDistance) GetLogicalOnuDistance() uint32 {
	if m != nil {
		return m.LogicalOnuDistance
	}
	return 0
}

type OmciMsg struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OmciMsg) Reset()         { *m = OmciMsg{} }
func (m *OmciMsg) String() string { return proto.CompactTextString(m) }
func (*OmciMsg) ProtoMessage()    {}
func (*OmciMsg) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{13}
}

func (m *OmciMsg) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OmciMsg.Unmarshal(m, b)
}
func (m *OmciMsg) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OmciMsg.Marshal(b, m, deterministic)
}
func (m *OmciMsg) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OmciMsg.Merge(m, src)
}
func (m *OmciMsg) XXX_Size() int {
	return xxx_messageInfo_OmciMsg.Size(m)
}
func (m *OmciMsg) XXX_DiscardUnknown() {
	xxx_messageInfo_OmciMsg.DiscardUnknown(m)
}

var xxx_messageInfo_OmciMsg proto.InternalMessageInfo

func (m *OmciMsg) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OmciMsg) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OmciMsg) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type OnuPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	PortNo               uint32   `protobuf:"fixed32,4,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,5,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,3,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuPacket) Reset()         { *m = OnuPacket{} }
func (m *OnuPacket) String() string { return proto.CompactTextString(m) }
func (*OnuPacket) ProtoMessage()    {}
func (*OnuPacket) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{14}
}

func (m *OnuPacket) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuPacket.Unmarshal(m, b)
}
func (m *OnuPacket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuPacket.Marshal(b, m, deterministic)
}
func (m *OnuPacket) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuPacket.Merge(m, src)
}
func (m *OnuPacket) XXX_Size() int {
	return xxx_messageInfo_OnuPacket.Size(m)
}
func (m *OnuPacket) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuPacket.DiscardUnknown(m)
}

var xxx_messageInfo_OnuPacket proto.InternalMessageInfo

func (m *OnuPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuPacket) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuPacket) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *OnuPacket) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *OnuPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type UplinkPacket struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Pkt                  []byte   `protobuf:"bytes,2,opt,name=pkt,proto3" json:"pkt,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *UplinkPacket) Reset()         { *m = UplinkPacket{} }
func (m *UplinkPacket) String() string { return proto.CompactTextString(m) }
func (*UplinkPacket) ProtoMessage()    {}
func (*UplinkPacket) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{15}
}

func (m *UplinkPacket) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_UplinkPacket.Unmarshal(m, b)
}
func (m *UplinkPacket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_UplinkPacket.Marshal(b, m, deterministic)
}
func (m *UplinkPacket) XXX_Merge(src proto.Message) {
	xxx_messageInfo_UplinkPacket.Merge(m, src)
}
func (m *UplinkPacket) XXX_Size() int {
	return xxx_messageInfo_UplinkPacket.Size(m)
}
func (m *UplinkPacket) XXX_DiscardUnknown() {
	xxx_messageInfo_UplinkPacket.DiscardUnknown(m)
}

var xxx_messageInfo_UplinkPacket proto.InternalMessageInfo

func (m *UplinkPacket) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *UplinkPacket) GetPkt() []byte {
	if m != nil {
		return m.Pkt
	}
	return nil
}

type DeviceInfo struct {
	Vendor              string `protobuf:"bytes,1,opt,name=vendor,proto3" json:"vendor,omitempty"`
	Model               string `protobuf:"bytes,2,opt,name=model,proto3" json:"model,omitempty"`
	HardwareVersion     string `protobuf:"bytes,3,opt,name=hardware_version,json=hardwareVersion,proto3" json:"hardware_version,omitempty"`
	FirmwareVersion     string `protobuf:"bytes,4,opt,name=firmware_version,json=firmwareVersion,proto3" json:"firmware_version,omitempty"`
	DeviceId            string `protobuf:"bytes,16,opt,name=device_id,json=deviceId,proto3" json:"device_id,omitempty"`
	DeviceSerialNumber  string `protobuf:"bytes,17,opt,name=device_serial_number,json=deviceSerialNumber,proto3" json:"device_serial_number,omitempty"`
	PreviouslyConnected bool   `protobuf:"varint,19,opt,name=previously_connected,json=previouslyConnected,proto3" json:"previously_connected,omitempty"`
	// Total number of pon intf ports on the device
	PonPorts             uint32                             `protobuf:"fixed32,12,opt,name=pon_ports,json=ponPorts,proto3" json:"pon_ports,omitempty"`
	Ranges               []*DeviceInfo_DeviceResourceRanges `protobuf:"bytes,15,rep,name=ranges,proto3" json:"ranges,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                           `json:"-"`
	XXX_unrecognized     []byte                             `json:"-"`
	XXX_sizecache        int32                              `json:"-"`
}

func (m *DeviceInfo) Reset()         { *m = DeviceInfo{} }
func (m *DeviceInfo) String() string { return proto.CompactTextString(m) }
func (*DeviceInfo) ProtoMessage()    {}
func (*DeviceInfo) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16}
}

func (m *DeviceInfo) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceInfo.Unmarshal(m, b)
}
func (m *DeviceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceInfo.Marshal(b, m, deterministic)
}
func (m *DeviceInfo) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceInfo.Merge(m, src)
}
func (m *DeviceInfo) XXX_Size() int {
	return xxx_messageInfo_DeviceInfo.Size(m)
}
func (m *DeviceInfo) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceInfo.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceInfo proto.InternalMessageInfo

func (m *DeviceInfo) GetVendor() string {
	if m != nil {
		return m.Vendor
	}
	return ""
}

func (m *DeviceInfo) GetModel() string {
	if m != nil {
		return m.Model
	}
	return ""
}

func (m *DeviceInfo) GetHardwareVersion() string {
	if m != nil {
		return m.HardwareVersion
	}
	return ""
}

func (m *DeviceInfo) GetFirmwareVersion() string {
	if m != nil {
		return m.FirmwareVersion
	}
	return ""
}

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

func (m *DeviceInfo) GetDeviceSerialNumber() string {
	if m != nil {
		return m.DeviceSerialNumber
	}
	return ""
}

func (m *DeviceInfo) GetPreviouslyConnected() bool {
	if m != nil {
		return m.PreviouslyConnected
	}
	return false
}

func (m *DeviceInfo) GetPonPorts() uint32 {
	if m != nil {
		return m.PonPorts
	}
	return 0
}

func (m *DeviceInfo) GetRanges() []*DeviceInfo_DeviceResourceRanges {
	if m != nil {
		return m.Ranges
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges struct {
	// List of 0 or more intf_ids that use the same technology and pools.
	// If 0 intf_ids supplied, it implies ALL interfaces
	IntfIds []uint32 `protobuf:"fixed32,1,rep,packed,name=intf_ids,json=intfIds,proto3" json:"intf_ids,omitempty"`
	// Technology profile for this pool
	Technology           string                                  `protobuf:"bytes,2,opt,name=technology,proto3" json:"technology,omitempty"`
	Pools                []*DeviceInfo_DeviceResourceRanges_Pool `protobuf:"bytes,3,rep,name=pools,proto3" json:"pools,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *DeviceInfo_DeviceResourceRanges) Reset()         { *m = DeviceInfo_DeviceResourceRanges{} }
func (m *DeviceInfo_DeviceResourceRanges) String() string { return proto.CompactTextString(m) }
func (*DeviceInfo_DeviceResourceRanges) ProtoMessage()    {}
func (*DeviceInfo_DeviceResourceRanges) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0}
}

func (m *DeviceInfo_DeviceResourceRanges) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges.Unmarshal(m, b)
}
func (m *DeviceInfo_DeviceResourceRanges) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges.Marshal(b, m, deterministic)
}
func (m *DeviceInfo_DeviceResourceRanges) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceInfo_DeviceResourceRanges.Merge(m, src)
}
func (m *DeviceInfo_DeviceResourceRanges) XXX_Size() int {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges.Size(m)
}
func (m *DeviceInfo_DeviceResourceRanges) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceInfo_DeviceResourceRanges.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges) GetIntfIds() []uint32 {
	if m != nil {
		return m.IntfIds
	}
	return nil
}

func (m *DeviceInfo_DeviceResourceRanges) GetTechnology() string {
	if m != nil {
		return m.Technology
	}
	return ""
}

func (m *DeviceInfo_DeviceResourceRanges) GetPools() []*DeviceInfo_DeviceResourceRanges_Pool {
	if m != nil {
		return m.Pools
	}
	return nil
}

type DeviceInfo_DeviceResourceRanges_Pool struct {
	Type                 DeviceInfo_DeviceResourceRanges_Pool_PoolType    `protobuf:"varint,1,opt,name=type,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType" json:"type,omitempty"`
	Sharing              DeviceInfo_DeviceResourceRanges_Pool_SharingType `protobuf:"varint,2,opt,name=sharing,proto3,enum=openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType" json:"sharing,omitempty"`
	Start                uint32                                           `protobuf:"fixed32,3,opt,name=start,proto3" json:"start,omitempty"`
	End                  uint32                                           `protobuf:"fixed32,4,opt,name=end,proto3" json:"end,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                         `json:"-"`
	XXX_unrecognized     []byte                                           `json:"-"`
	XXX_sizecache        int32                                            `json:"-"`
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) Reset()         { *m = DeviceInfo_DeviceResourceRanges_Pool{} }
func (m *DeviceInfo_DeviceResourceRanges_Pool) String() string { return proto.CompactTextString(m) }
func (*DeviceInfo_DeviceResourceRanges_Pool) ProtoMessage()    {}
func (*DeviceInfo_DeviceResourceRanges_Pool) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{16, 0, 0}
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool.Unmarshal(m, b)
}
func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool.Marshal(b, m, deterministic)
}
func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool.Merge(m, src)
}
func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_Size() int {
	return xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool.Size(m)
}
func (m *DeviceInfo_DeviceResourceRanges_Pool) XXX_DiscardUnknown() {
	xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool.DiscardUnknown(m)
}

var xxx_messageInfo_DeviceInfo_DeviceResourceRanges_Pool proto.InternalMessageInfo

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetType() DeviceInfo_DeviceResourceRanges_Pool_PoolType {
	if m != nil {
		return m.Type
	}
	return DeviceInfo_DeviceResourceRanges_Pool_ONU_ID
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetSharing() DeviceInfo_DeviceResourceRanges_Pool_SharingType {
	if m != nil {
		return m.Sharing
	}
	return DeviceInfo_DeviceResourceRanges_Pool_DEDICATED_PER_INTF
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetStart() uint32 {
	if m != nil {
		return m.Start
	}
	return 0
}

func (m *DeviceInfo_DeviceResourceRanges_Pool) GetEnd() uint32 {
	if m != nil {
		return m.End
	}
	return 0
}

type Classifier struct {
	OTpid                uint32   `protobuf:"fixed32,1,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	OVid                 uint32   `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	ITpid                uint32   `protobuf:"fixed32,3,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	IVid                 uint32   `protobuf:"fixed32,4,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	OPbits               uint32   `protobuf:"fixed32,5,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	IPbits               uint32   `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	EthType              uint32   `protobuf:"fixed32,7,opt,name=eth_type,json=ethType,proto3" json:"eth_type,omitempty"`
	DstMac               []byte   `protobuf:"bytes,8,opt,name=dst_mac,json=dstMac,proto3" json:"dst_mac,omitempty"`
	SrcMac               []byte   `protobuf:"bytes,9,opt,name=src_mac,json=srcMac,proto3" json:"src_mac,omitempty"`
	IpProto              uint32   `protobuf:"fixed32,10,opt,name=ip_proto,json=ipProto,proto3" json:"ip_proto,omitempty"`
	DstIp                uint32   `protobuf:"fixed32,11,opt,name=dst_ip,json=dstIp,proto3" json:"dst_ip,omitempty"`
	SrcIp                uint32   `protobuf:"fixed32,12,opt,name=src_ip,json=srcIp,proto3" json:"src_ip,omitempty"`
	SrcPort              uint32   `protobuf:"fixed32,13,opt,name=src_port,json=srcPort,proto3" json:"src_port,omitempty"`
	DstPort              uint32   `protobuf:"fixed32,14,opt,name=dst_port,json=dstPort,proto3" json:"dst_port,omitempty"`
	PktTagType           string   `protobuf:"bytes,15,opt,name=pkt_tag_type,json=pktTagType,proto3" json:"pkt_tag_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Classifier) Reset()         { *m = Classifier{} }
func (m *Classifier) String() string { return proto.CompactTextString(m) }
func (*Classifier) ProtoMessage()    {}
func (*Classifier) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{17}
}

func (m *Classifier) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Classifier.Unmarshal(m, b)
}
func (m *Classifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Classifier.Marshal(b, m, deterministic)
}
func (m *Classifier) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Classifier.Merge(m, src)
}
func (m *Classifier) XXX_Size() int {
	return xxx_messageInfo_Classifier.Size(m)
}
func (m *Classifier) XXX_DiscardUnknown() {
	xxx_messageInfo_Classifier.DiscardUnknown(m)
}

var xxx_messageInfo_Classifier proto.InternalMessageInfo

func (m *Classifier) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Classifier) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Classifier) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

func (m *Classifier) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Classifier) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Classifier) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Classifier) GetEthType() uint32 {
	if m != nil {
		return m.EthType
	}
	return 0
}

func (m *Classifier) GetDstMac() []byte {
	if m != nil {
		return m.DstMac
	}
	return nil
}

func (m *Classifier) GetSrcMac() []byte {
	if m != nil {
		return m.SrcMac
	}
	return nil
}

func (m *Classifier) GetIpProto() uint32 {
	if m != nil {
		return m.IpProto
	}
	return 0
}

func (m *Classifier) GetDstIp() uint32 {
	if m != nil {
		return m.DstIp
	}
	return 0
}

func (m *Classifier) GetSrcIp() uint32 {
	if m != nil {
		return m.SrcIp
	}
	return 0
}

func (m *Classifier) GetSrcPort() uint32 {
	if m != nil {
		return m.SrcPort
	}
	return 0
}

func (m *Classifier) GetDstPort() uint32 {
	if m != nil {
		return m.DstPort
	}
	return 0
}

func (m *Classifier) GetPktTagType() string {
	if m != nil {
		return m.PktTagType
	}
	return ""
}

type ActionCmd struct {
	AddOuterTag          bool     `protobuf:"varint,1,opt,name=add_outer_tag,json=addOuterTag,proto3" json:"add_outer_tag,omitempty"`
	RemoveOuterTag       bool     `protobuf:"varint,2,opt,name=remove_outer_tag,json=removeOuterTag,proto3" json:"remove_outer_tag,omitempty"`
	TrapToHost           bool     `protobuf:"varint,3,opt,name=trap_to_host,json=trapToHost,proto3" json:"trap_to_host,omitempty"`
	RemarkOuterPbits     bool     `protobuf:"varint,4,opt,name=remark_outer_pbits,json=remarkOuterPbits,proto3" json:"remark_outer_pbits,omitempty"`
	RemarkInnerPbits     bool     `protobuf:"varint,5,opt,name=remark_inner_pbits,json=remarkInnerPbits,proto3" json:"remark_inner_pbits,omitempty"`
	AddInnerTag          bool     `protobuf:"varint,6,opt,name=add_inner_tag,json=addInnerTag,proto3" json:"add_inner_tag,omitempty"`
	RemoveInnerTag       bool     `protobuf:"varint,7,opt,name=remove_inner_tag,json=removeInnerTag,proto3" json:"remove_inner_tag,omitempty"`
	TranslateInnerTag    bool     `protobuf:"varint,8,opt,name=translate_inner_tag,json=translateInnerTag,proto3" json:"translate_inner_tag,omitempty"`
	TranslateOuterTag    bool     `protobuf:"varint,9,opt,name=translate_outer_tag,json=translateOuterTag,proto3" json:"translate_outer_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ActionCmd) Reset()         { *m = ActionCmd{} }
func (m *ActionCmd) String() string { return proto.CompactTextString(m) }
func (*ActionCmd) ProtoMessage()    {}
func (*ActionCmd) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{18}
}

func (m *ActionCmd) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ActionCmd.Unmarshal(m, b)
}
func (m *ActionCmd) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ActionCmd.Marshal(b, m, deterministic)
}
func (m *ActionCmd) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ActionCmd.Merge(m, src)
}
func (m *ActionCmd) XXX_Size() int {
	return xxx_messageInfo_ActionCmd.Size(m)
}
func (m *ActionCmd) XXX_DiscardUnknown() {
	xxx_messageInfo_ActionCmd.DiscardUnknown(m)
}

var xxx_messageInfo_ActionCmd proto.InternalMessageInfo

func (m *ActionCmd) GetAddOuterTag() bool {
	if m != nil {
		return m.AddOuterTag
	}
	return false
}

func (m *ActionCmd) GetRemoveOuterTag() bool {
	if m != nil {
		return m.RemoveOuterTag
	}
	return false
}

func (m *ActionCmd) GetTrapToHost() bool {
	if m != nil {
		return m.TrapToHost
	}
	return false
}

func (m *ActionCmd) GetRemarkOuterPbits() bool {
	if m != nil {
		return m.RemarkOuterPbits
	}
	return false
}

func (m *ActionCmd) GetRemarkInnerPbits() bool {
	if m != nil {
		return m.RemarkInnerPbits
	}
	return false
}

func (m *ActionCmd) GetAddInnerTag() bool {
	if m != nil {
		return m.AddInnerTag
	}
	return false
}

func (m *ActionCmd) GetRemoveInnerTag() bool {
	if m != nil {
		return m.RemoveInnerTag
	}
	return false
}

func (m *ActionCmd) GetTranslateInnerTag() bool {
	if m != nil {
		return m.TranslateInnerTag
	}
	return false
}

func (m *ActionCmd) GetTranslateOuterTag() bool {
	if m != nil {
		return m.TranslateOuterTag
	}
	return false
}

type Action struct {
	Cmd                  *ActionCmd `protobuf:"bytes,1,opt,name=cmd,proto3" json:"cmd,omitempty"`
	OVid                 uint32     `protobuf:"fixed32,2,opt,name=o_vid,json=oVid,proto3" json:"o_vid,omitempty"`
	OPbits               uint32     `protobuf:"fixed32,3,opt,name=o_pbits,json=oPbits,proto3" json:"o_pbits,omitempty"`
	OTpid                uint32     `protobuf:"fixed32,4,opt,name=o_tpid,json=oTpid,proto3" json:"o_tpid,omitempty"`
	IVid                 uint32     `protobuf:"fixed32,5,opt,name=i_vid,json=iVid,proto3" json:"i_vid,omitempty"`
	IPbits               uint32     `protobuf:"fixed32,6,opt,name=i_pbits,json=iPbits,proto3" json:"i_pbits,omitempty"`
	ITpid                uint32     `protobuf:"fixed32,7,opt,name=i_tpid,json=iTpid,proto3" json:"i_tpid,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Action) Reset()         { *m = Action{} }
func (m *Action) String() string { return proto.CompactTextString(m) }
func (*Action) ProtoMessage()    {}
func (*Action) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{19}
}

func (m *Action) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Action.Unmarshal(m, b)
}
func (m *Action) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Action.Marshal(b, m, deterministic)
}
func (m *Action) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Action.Merge(m, src)
}
func (m *Action) XXX_Size() int {
	return xxx_messageInfo_Action.Size(m)
}
func (m *Action) XXX_DiscardUnknown() {
	xxx_messageInfo_Action.DiscardUnknown(m)
}

var xxx_messageInfo_Action proto.InternalMessageInfo

func (m *Action) GetCmd() *ActionCmd {
	if m != nil {
		return m.Cmd
	}
	return nil
}

func (m *Action) GetOVid() uint32 {
	if m != nil {
		return m.OVid
	}
	return 0
}

func (m *Action) GetOPbits() uint32 {
	if m != nil {
		return m.OPbits
	}
	return 0
}

func (m *Action) GetOTpid() uint32 {
	if m != nil {
		return m.OTpid
	}
	return 0
}

func (m *Action) GetIVid() uint32 {
	if m != nil {
		return m.IVid
	}
	return 0
}

func (m *Action) GetIPbits() uint32 {
	if m != nil {
		return m.IPbits
	}
	return 0
}

func (m *Action) GetITpid() uint32 {
	if m != nil {
		return m.ITpid
	}
	return 0
}

type Flow struct {
	AccessIntfId         int32             `protobuf:"fixed32,1,opt,name=access_intf_id,json=accessIntfId,proto3" json:"access_intf_id,omitempty"`
	OnuId                int32             `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	UniId                int32             `protobuf:"fixed32,11,opt,name=uni_id,json=uniId,proto3" json:"uni_id,omitempty"`
	FlowId               uint64            `protobuf:"fixed64,3,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	SymmetricFlowId      uint64            `protobuf:"fixed64,18,opt,name=symmetric_flow_id,json=symmetricFlowId,proto3" json:"symmetric_flow_id,omitempty"`
	FlowType             string            `protobuf:"bytes,4,opt,name=flow_type,json=flowType,proto3" json:"flow_type,omitempty"`
	AllocId              int32             `protobuf:"fixed32,10,opt,name=alloc_id,json=allocId,proto3" json:"alloc_id,omitempty"`
	NetworkIntfId        int32             `protobuf:"fixed32,5,opt,name=network_intf_id,json=networkIntfId,proto3" json:"network_intf_id,omitempty"`
	GemportId            int32             `protobuf:"fixed32,6,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	Classifier           *Classifier       `protobuf:"bytes,7,opt,name=classifier,proto3" json:"classifier,omitempty"`
	Action               *Action           `protobuf:"bytes,8,opt,name=action,proto3" json:"action,omitempty"`
	Priority             int32             `protobuf:"fixed32,9,opt,name=priority,proto3" json:"priority,omitempty"`
	Cookie               uint64            `protobuf:"fixed64,12,opt,name=cookie,proto3" json:"cookie,omitempty"`
	PortNo               uint32            `protobuf:"fixed32,13,opt,name=port_no,json=portNo,proto3" json:"port_no,omitempty"`
	GroupId              uint32            `protobuf:"fixed32,14,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	TechProfileId        uint32            `protobuf:"fixed32,15,opt,name=tech_profile_id,json=techProfileId,proto3" json:"tech_profile_id,omitempty"`
	ReplicateFlow        bool              `protobuf:"varint,16,opt,name=replicate_flow,json=replicateFlow,proto3" json:"replicate_flow,omitempty"`
	PbitToGemport        map[uint32]uint32 `protobuf:"bytes,17,rep,name=pbit_to_gemport,json=pbitToGemport,proto3" json:"pbit_to_gemport,omitempty" protobuf_key:"fixed32,1,opt,name=key,proto3" protobuf_val:"fixed32,2,opt,name=value,proto3"`
	GemportToAes         map[uint32]bool   `protobuf:"bytes,19,rep,name=gemport_to_aes,json=gemportToAes,proto3" json:"gemport_to_aes,omitempty" protobuf_key:"fixed32,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *Flow) Reset()         { *m = Flow{} }
func (m *Flow) String() string { return proto.CompactTextString(m) }
func (*Flow) ProtoMessage()    {}
func (*Flow) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{20}
}

func (m *Flow) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Flow.Unmarshal(m, b)
}
func (m *Flow) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Flow.Marshal(b, m, deterministic)
}
func (m *Flow) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Flow.Merge(m, src)
}
func (m *Flow) XXX_Size() int {
	return xxx_messageInfo_Flow.Size(m)
}
func (m *Flow) XXX_DiscardUnknown() {
	xxx_messageInfo_Flow.DiscardUnknown(m)
}

var xxx_messageInfo_Flow proto.InternalMessageInfo

func (m *Flow) GetAccessIntfId() int32 {
	if m != nil {
		return m.AccessIntfId
	}
	return 0
}

func (m *Flow) GetOnuId() int32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *Flow) GetUniId() int32 {
	if m != nil {
		return m.UniId
	}
	return 0
}

func (m *Flow) GetFlowId() uint64 {
	if m != nil {
		return m.FlowId
	}
	return 0
}

func (m *Flow) GetSymmetricFlowId() uint64 {
	if m != nil {
		return m.SymmetricFlowId
	}
	return 0
}

func (m *Flow) GetFlowType() string {
	if m != nil {
		return m.FlowType
	}
	return ""
}

func (m *Flow) GetAllocId() int32 {
	if m != nil {
		return m.AllocId
	}
	return 0
}

func (m *Flow) GetNetworkIntfId() int32 {
	if m != nil {
		return m.NetworkIntfId
	}
	return 0
}

func (m *Flow) GetGemportId() int32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *Flow) GetClassifier() *Classifier {
	if m != nil {
		return m.Classifier
	}
	return nil
}

func (m *Flow) GetAction() *Action {
	if m != nil {
		return m.Action
	}
	return nil
}

func (m *Flow) GetPriority() int32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

func (m *Flow) GetCookie() uint64 {
	if m != nil {
		return m.Cookie
	}
	return 0
}

func (m *Flow) GetPortNo() uint32 {
	if m != nil {
		return m.PortNo
	}
	return 0
}

func (m *Flow) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *Flow) GetTechProfileId() uint32 {
	if m != nil {
		return m.TechProfileId
	}
	return 0
}

func (m *Flow) GetReplicateFlow() bool {
	if m != nil {
		return m.ReplicateFlow
	}
	return false
}

func (m *Flow) GetPbitToGemport() map[uint32]uint32 {
	if m != nil {
		return m.PbitToGemport
	}
	return nil
}

func (m *Flow) GetGemportToAes() map[uint32]bool {
	if m != nil {
		return m.GemportToAes
	}
	return nil
}

type SerialNumber struct {
	VendorId             []byte   `protobuf:"bytes,1,opt,name=vendor_id,json=vendorId,proto3" json:"vendor_id,omitempty"`
	VendorSpecific       []byte   `protobuf:"bytes,2,opt,name=vendor_specific,json=vendorSpecific,proto3" json:"vendor_specific,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *SerialNumber) Reset()         { *m = SerialNumber{} }
func (m *SerialNumber) String() string { return proto.CompactTextString(m) }
func (*SerialNumber) ProtoMessage()    {}
func (*SerialNumber) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{21}
}

func (m *SerialNumber) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_SerialNumber.Unmarshal(m, b)
}
func (m *SerialNumber) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_SerialNumber.Marshal(b, m, deterministic)
}
func (m *SerialNumber) XXX_Merge(src proto.Message) {
	xxx_messageInfo_SerialNumber.Merge(m, src)
}
func (m *SerialNumber) XXX_Size() int {
	return xxx_messageInfo_SerialNumber.Size(m)
}
func (m *SerialNumber) XXX_DiscardUnknown() {
	xxx_messageInfo_SerialNumber.DiscardUnknown(m)
}

var xxx_messageInfo_SerialNumber proto.InternalMessageInfo

func (m *SerialNumber) GetVendorId() []byte {
	if m != nil {
		return m.VendorId
	}
	return nil
}

func (m *SerialNumber) GetVendorSpecific() []byte {
	if m != nil {
		return m.VendorSpecific
	}
	return nil
}

type PortStatistics struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	RxUcastPackets       uint64   `protobuf:"fixed64,4,opt,name=rx_ucast_packets,json=rxUcastPackets,proto3" json:"rx_ucast_packets,omitempty"`
	RxMcastPackets       uint64   `protobuf:"fixed64,5,opt,name=rx_mcast_packets,json=rxMcastPackets,proto3" json:"rx_mcast_packets,omitempty"`
	RxBcastPackets       uint64   `protobuf:"fixed64,6,opt,name=rx_bcast_packets,json=rxBcastPackets,proto3" json:"rx_bcast_packets,omitempty"`
	RxErrorPackets       uint64   `protobuf:"fixed64,7,opt,name=rx_error_packets,json=rxErrorPackets,proto3" json:"rx_error_packets,omitempty"`
	RxFrames             uint64   `protobuf:"fixed64,17,opt,name=rx_frames,json=rxFrames,proto3" json:"rx_frames,omitempty"`
	RxFrames_64          uint64   `protobuf:"fixed64,18,opt,name=rx_frames_64,json=rxFrames64,proto3" json:"rx_frames_64,omitempty"`
	RxFrames_65_127      uint64   `protobuf:"fixed64,19,opt,name=rx_frames_65_127,json=rxFrames65127,proto3" json:"rx_frames_65_127,omitempty"`
	RxFrames_128_255     uint64   `protobuf:"fixed64,20,opt,name=rx_frames_128_255,json=rxFrames128255,proto3" json:"rx_frames_128_255,omitempty"`
	RxFrames_256_511     uint64   `protobuf:"fixed64,21,opt,name=rx_frames_256_511,json=rxFrames256511,proto3" json:"rx_frames_256_511,omitempty"`
	RxFrames_512_1023    uint64   `protobuf:"fixed64,22,opt,name=rx_frames_512_1023,json=rxFrames5121023,proto3" json:"rx_frames_512_1023,omitempty"`
	RxFrames_1024_1518   uint64   `protobuf:"fixed64,23,opt,name=rx_frames_1024_1518,json=rxFrames10241518,proto3" json:"rx_frames_1024_1518,omitempty"`
	RxFrames_1519_2047   uint64   `protobuf:"fixed64,24,opt,name=rx_frames_1519_2047,json=rxFrames15192047,proto3" json:"rx_frames_1519_2047,omitempty"`
	RxFrames_2048_4095   uint64   `protobuf:"fixed64,25,opt,name=rx_frames_2048_4095,json=rxFrames20484095,proto3" json:"rx_frames_2048_4095,omitempty"`
	RxFrames_4096_9216   uint64   `protobuf:"fixed64,26,opt,name=rx_frames_4096_9216,json=rxFrames40969216,proto3" json:"rx_frames_4096_9216,omitempty"`
	RxFrames_9217_16383  uint64   `protobuf:"fixed64,27,opt,name=rx_frames_9217_16383,json=rxFrames921716383,proto3" json:"rx_frames_9217_16383,omitempty"`
	RxCrcErrors          uint64   `protobuf:"fixed64,14,opt,name=rx_crc_errors,json=rxCrcErrors,proto3" json:"rx_crc_errors,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxUcastPackets       uint64   `protobuf:"fixed64,10,opt,name=tx_ucast_packets,json=txUcastPackets,proto3" json:"tx_ucast_packets,omitempty"`
	TxMcastPackets       uint64   `protobuf:"fixed64,11,opt,name=tx_mcast_packets,json=txMcastPackets,proto3" json:"tx_mcast_packets,omitempty"`
	TxBcastPackets       uint64   `protobuf:"fixed64,12,opt,name=tx_bcast_packets,json=txBcastPackets,proto3" json:"tx_bcast_packets,omitempty"`
	TxErrorPackets       uint64   `protobuf:"fixed64,13,opt,name=tx_error_packets,json=txErrorPackets,proto3" json:"tx_error_packets,omitempty"`
	TxFrames             uint64   `protobuf:"fixed64,28,opt,name=tx_frames,json=txFrames,proto3" json:"tx_frames,omitempty"`
	TxFrames_64          uint64   `protobuf:"fixed64,29,opt,name=tx_frames_64,json=txFrames64,proto3" json:"tx_frames_64,omitempty"`
	TxFrames_65_127      uint64   `protobuf:"fixed64,30,opt,name=tx_frames_65_127,json=txFrames65127,proto3" json:"tx_frames_65_127,omitempty"`
	TxFrames_128_255     uint64   `protobuf:"fixed64,31,opt,name=tx_frames_128_255,json=txFrames128255,proto3" json:"tx_frames_128_255,omitempty"`
	TxFrames_256_511     uint64   `protobuf:"fixed64,32,opt,name=tx_frames_256_511,json=txFrames256511,proto3" json:"tx_frames_256_511,omitempty"`
	TxFrames_512_1023    uint64   `protobuf:"fixed64,33,opt,name=tx_frames_512_1023,json=txFrames5121023,proto3" json:"tx_frames_512_1023,omitempty"`
	TxFrames_1024_1518   uint64   `protobuf:"fixed64,34,opt,name=tx_frames_1024_1518,json=txFrames10241518,proto3" json:"tx_frames_1024_1518,omitempty"`
	TxFrames_1519_2047   uint64   `protobuf:"fixed64,35,opt,name=tx_frames_1519_2047,json=txFrames15192047,proto3" json:"tx_frames_1519_2047,omitempty"`
	TxFrames_2048_4095   uint64   `protobuf:"fixed64,36,opt,name=tx_frames_2048_4095,json=txFrames20484095,proto3" json:"tx_frames_2048_4095,omitempty"`
	TxFrames_4096_9216   uint64   `protobuf:"fixed64,37,opt,name=tx_frames_4096_9216,json=txFrames40969216,proto3" json:"tx_frames_4096_9216,omitempty"`
	TxFrames_9217_16383  uint64   `protobuf:"fixed64,38,opt,name=tx_frames_9217_16383,json=txFrames921716383,proto3" json:"tx_frames_9217_16383,omitempty"`
	BipErrors            uint64   `protobuf:"fixed64,15,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *PortStatistics) Reset()         { *m = PortStatistics{} }
func (m *PortStatistics) String() string { return proto.CompactTextString(m) }
func (*PortStatistics) ProtoMessage()    {}
func (*PortStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{22}
}

func (m *PortStatistics) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PortStatistics.Unmarshal(m, b)
}
func (m *PortStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PortStatistics.Marshal(b, m, deterministic)
}
func (m *PortStatistics) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PortStatistics.Merge(m, src)
}
func (m *PortStatistics) XXX_Size() int {
	return xxx_messageInfo_PortStatistics.Size(m)
}
func (m *PortStatistics) XXX_DiscardUnknown() {
	xxx_messageInfo_PortStatistics.DiscardUnknown(m)
}

var xxx_messageInfo_PortStatistics proto.InternalMessageInfo

func (m *PortStatistics) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PortStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *PortStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *PortStatistics) GetRxUcastPackets() uint64 {
	if m != nil {
		return m.RxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxMcastPackets() uint64 {
	if m != nil {
		return m.RxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxBcastPackets() uint64 {
	if m != nil {
		return m.RxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetRxErrorPackets() uint64 {
	if m != nil {
		return m.RxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetRxFrames() uint64 {
	if m != nil {
		return m.RxFrames
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_64() uint64 {
	if m != nil {
		return m.RxFrames_64
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_65_127() uint64 {
	if m != nil {
		return m.RxFrames_65_127
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_128_255() uint64 {
	if m != nil {
		return m.RxFrames_128_255
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_256_511() uint64 {
	if m != nil {
		return m.RxFrames_256_511
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_512_1023() uint64 {
	if m != nil {
		return m.RxFrames_512_1023
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_1024_1518() uint64 {
	if m != nil {
		return m.RxFrames_1024_1518
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_1519_2047() uint64 {
	if m != nil {
		return m.RxFrames_1519_2047
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_2048_4095() uint64 {
	if m != nil {
		return m.RxFrames_2048_4095
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_4096_9216() uint64 {
	if m != nil {
		return m.RxFrames_4096_9216
	}
	return 0
}

func (m *PortStatistics) GetRxFrames_9217_16383() uint64 {
	if m != nil {
		return m.RxFrames_9217_16383
	}
	return 0
}

func (m *PortStatistics) GetRxCrcErrors() uint64 {
	if m != nil {
		return m.RxCrcErrors
	}
	return 0
}

func (m *PortStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *PortStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *PortStatistics) GetTxUcastPackets() uint64 {
	if m != nil {
		return m.TxUcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxMcastPackets() uint64 {
	if m != nil {
		return m.TxMcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxBcastPackets() uint64 {
	if m != nil {
		return m.TxBcastPackets
	}
	return 0
}

func (m *PortStatistics) GetTxErrorPackets() uint64 {
	if m != nil {
		return m.TxErrorPackets
	}
	return 0
}

func (m *PortStatistics) GetTxFrames() uint64 {
	if m != nil {
		return m.TxFrames
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_64() uint64 {
	if m != nil {
		return m.TxFrames_64
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_65_127() uint64 {
	if m != nil {
		return m.TxFrames_65_127
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_128_255() uint64 {
	if m != nil {
		return m.TxFrames_128_255
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_256_511() uint64 {
	if m != nil {
		return m.TxFrames_256_511
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_512_1023() uint64 {
	if m != nil {
		return m.TxFrames_512_1023
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_1024_1518() uint64 {
	if m != nil {
		return m.TxFrames_1024_1518
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_1519_2047() uint64 {
	if m != nil {
		return m.TxFrames_1519_2047
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_2048_4095() uint64 {
	if m != nil {
		return m.TxFrames_2048_4095
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_4096_9216() uint64 {
	if m != nil {
		return m.TxFrames_4096_9216
	}
	return 0
}

func (m *PortStatistics) GetTxFrames_9217_16383() uint64 {
	if m != nil {
		return m.TxFrames_9217_16383
	}
	return 0
}

func (m *PortStatistics) GetBipErrors() uint64 {
	if m != nil {
		return m.BipErrors
	}
	return 0
}

func (m *PortStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type OnuStatistics struct {
	IntfId                    uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                     uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	PositiveDrift             uint64   `protobuf:"fixed64,3,opt,name=positive_drift,json=positiveDrift,proto3" json:"positive_drift,omitempty"`
	NegativeDrift             uint64   `protobuf:"fixed64,4,opt,name=negative_drift,json=negativeDrift,proto3" json:"negative_drift,omitempty"`
	DelimiterMissDetection    uint64   `protobuf:"fixed64,5,opt,name=delimiter_miss_detection,json=delimiterMissDetection,proto3" json:"delimiter_miss_detection,omitempty"`
	BipErrors                 uint64   `protobuf:"fixed64,6,opt,name=bip_errors,json=bipErrors,proto3" json:"bip_errors,omitempty"`
	BipUnits                  uint64   `protobuf:"fixed64,7,opt,name=bip_units,json=bipUnits,proto3" json:"bip_units,omitempty"`
	FecCorrectedSymbols       uint64   `protobuf:"fixed64,8,opt,name=fec_corrected_symbols,json=fecCorrectedSymbols,proto3" json:"fec_corrected_symbols,omitempty"`
	FecCodewordsCorrected     uint64   `protobuf:"fixed64,9,opt,name=fec_codewords_corrected,json=fecCodewordsCorrected,proto3" json:"fec_codewords_corrected,omitempty"`
	FecCodewordsUncorrectable uint64   `protobuf:"fixed64,10,opt,name=fec_codewords_uncorrectable,json=fecCodewordsUncorrectable,proto3" json:"fec_codewords_uncorrectable,omitempty"`
	FecCodewords              uint64   `protobuf:"fixed64,11,opt,name=fec_codewords,json=fecCodewords,proto3" json:"fec_codewords,omitempty"`
	FecCorrectedUnits         uint64   `protobuf:"fixed64,12,opt,name=fec_corrected_units,json=fecCorrectedUnits,proto3" json:"fec_corrected_units,omitempty"`
	XgemKeyErrors             uint64   `protobuf:"fixed64,13,opt,name=xgem_key_errors,json=xgemKeyErrors,proto3" json:"xgem_key_errors,omitempty"`
	XgemLoss                  uint64   `protobuf:"fixed64,14,opt,name=xgem_loss,json=xgemLoss,proto3" json:"xgem_loss,omitempty"`
	RxPloamsError             uint64   `protobuf:"fixed64,15,opt,name=rx_ploams_error,json=rxPloamsError,proto3" json:"rx_ploams_error,omitempty"`
	RxPloamsNonIdle           uint64   `protobuf:"fixed64,16,opt,name=rx_ploams_non_idle,json=rxPloamsNonIdle,proto3" json:"rx_ploams_non_idle,omitempty"`
	RxOmci                    uint64   `protobuf:"fixed64,17,opt,name=rx_omci,json=rxOmci,proto3" json:"rx_omci,omitempty"`
	RxOmciPacketsCrcError     uint64   `protobuf:"fixed64,18,opt,name=rx_omci_packets_crc_error,json=rxOmciPacketsCrcError,proto3" json:"rx_omci_packets_crc_error,omitempty"`
	RxBytes                   uint64   `protobuf:"fixed64,19,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets                 uint64   `protobuf:"fixed64,20,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxBytes                   uint64   `protobuf:"fixed64,21,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets                 uint64   `protobuf:"fixed64,22,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	BerReported               uint64   `protobuf:"fixed64,23,opt,name=ber_reported,json=berReported,proto3" json:"ber_reported,omitempty"`
	LcdgErrors                uint64   `protobuf:"fixed64,24,opt,name=lcdg_errors,json=lcdgErrors,proto3" json:"lcdg_errors,omitempty"`
	RdiErrors                 uint64   `protobuf:"fixed64,25,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
	Timestamp                 uint32   `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
	XXX_unrecognized          []byte   `json:"-"`
	XXX_sizecache             int32    `json:"-"`
}

func (m *OnuStatistics) Reset()         { *m = OnuStatistics{} }
func (m *OnuStatistics) String() string { return proto.CompactTextString(m) }
func (*OnuStatistics) ProtoMessage()    {}
func (*OnuStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{23}
}

func (m *OnuStatistics) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuStatistics.Unmarshal(m, b)
}
func (m *OnuStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuStatistics.Marshal(b, m, deterministic)
}
func (m *OnuStatistics) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuStatistics.Merge(m, src)
}
func (m *OnuStatistics) XXX_Size() int {
	return xxx_messageInfo_OnuStatistics.Size(m)
}
func (m *OnuStatistics) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuStatistics.DiscardUnknown(m)
}

var xxx_messageInfo_OnuStatistics proto.InternalMessageInfo

func (m *OnuStatistics) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuStatistics) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuStatistics) GetPositiveDrift() uint64 {
	if m != nil {
		return m.PositiveDrift
	}
	return 0
}

func (m *OnuStatistics) GetNegativeDrift() uint64 {
	if m != nil {
		return m.NegativeDrift
	}
	return 0
}

func (m *OnuStatistics) GetDelimiterMissDetection() uint64 {
	if m != nil {
		return m.DelimiterMissDetection
	}
	return 0
}

func (m *OnuStatistics) GetBipErrors() uint64 {
	if m != nil {
		return m.BipErrors
	}
	return 0
}

func (m *OnuStatistics) GetBipUnits() uint64 {
	if m != nil {
		return m.BipUnits
	}
	return 0
}

func (m *OnuStatistics) GetFecCorrectedSymbols() uint64 {
	if m != nil {
		return m.FecCorrectedSymbols
	}
	return 0
}

func (m *OnuStatistics) GetFecCodewordsCorrected() uint64 {
	if m != nil {
		return m.FecCodewordsCorrected
	}
	return 0
}

func (m *OnuStatistics) GetFecCodewordsUncorrectable() uint64 {
	if m != nil {
		return m.FecCodewordsUncorrectable
	}
	return 0
}

func (m *OnuStatistics) GetFecCodewords() uint64 {
	if m != nil {
		return m.FecCodewords
	}
	return 0
}

func (m *OnuStatistics) GetFecCorrectedUnits() uint64 {
	if m != nil {
		return m.FecCorrectedUnits
	}
	return 0
}

func (m *OnuStatistics) GetXgemKeyErrors() uint64 {
	if m != nil {
		return m.XgemKeyErrors
	}
	return 0
}

func (m *OnuStatistics) GetXgemLoss() uint64 {
	if m != nil {
		return m.XgemLoss
	}
	return 0
}

func (m *OnuStatistics) GetRxPloamsError() uint64 {
	if m != nil {
		return m.RxPloamsError
	}
	return 0
}

func (m *OnuStatistics) GetRxPloamsNonIdle() uint64 {
	if m != nil {
		return m.RxPloamsNonIdle
	}
	return 0
}

func (m *OnuStatistics) GetRxOmci() uint64 {
	if m != nil {
		return m.RxOmci
	}
	return 0
}

func (m *OnuStatistics) GetRxOmciPacketsCrcError() uint64 {
	if m != nil {
		return m.RxOmciPacketsCrcError
	}
	return 0
}

func (m *OnuStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *OnuStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *OnuStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *OnuStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *OnuStatistics) GetBerReported() uint64 {
	if m != nil {
		return m.BerReported
	}
	return 0
}

func (m *OnuStatistics) GetLcdgErrors() uint64 {
	if m != nil {
		return m.LcdgErrors
	}
	return 0
}

func (m *OnuStatistics) GetRdiErrors() uint64 {
	if m != nil {
		return m.RdiErrors
	}
	return 0
}

func (m *OnuStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type GemPortStatistics struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	GemportId            uint32   `protobuf:"fixed32,2,opt,name=gemport_id,json=gemportId,proto3" json:"gemport_id,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,4,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,5,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,6,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,26,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GemPortStatistics) Reset()         { *m = GemPortStatistics{} }
func (m *GemPortStatistics) String() string { return proto.CompactTextString(m) }
func (*GemPortStatistics) ProtoMessage()    {}
func (*GemPortStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{24}
}

func (m *GemPortStatistics) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GemPortStatistics.Unmarshal(m, b)
}
func (m *GemPortStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GemPortStatistics.Marshal(b, m, deterministic)
}
func (m *GemPortStatistics) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GemPortStatistics.Merge(m, src)
}
func (m *GemPortStatistics) XXX_Size() int {
	return xxx_messageInfo_GemPortStatistics.Size(m)
}
func (m *GemPortStatistics) XXX_DiscardUnknown() {
	xxx_messageInfo_GemPortStatistics.DiscardUnknown(m)
}

var xxx_messageInfo_GemPortStatistics proto.InternalMessageInfo

func (m *GemPortStatistics) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *GemPortStatistics) GetGemportId() uint32 {
	if m != nil {
		return m.GemportId
	}
	return 0
}

func (m *GemPortStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *GemPortStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *GemPortStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *GemPortStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *GemPortStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type FlowStatistics struct {
	FlowId               uint32   `protobuf:"fixed32,1,opt,name=flow_id,json=flowId,proto3" json:"flow_id,omitempty"`
	RxBytes              uint64   `protobuf:"fixed64,2,opt,name=rx_bytes,json=rxBytes,proto3" json:"rx_bytes,omitempty"`
	RxPackets            uint64   `protobuf:"fixed64,3,opt,name=rx_packets,json=rxPackets,proto3" json:"rx_packets,omitempty"`
	TxBytes              uint64   `protobuf:"fixed64,8,opt,name=tx_bytes,json=txBytes,proto3" json:"tx_bytes,omitempty"`
	TxPackets            uint64   `protobuf:"fixed64,9,opt,name=tx_packets,json=txPackets,proto3" json:"tx_packets,omitempty"`
	Timestamp            uint32   `protobuf:"fixed32,16,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FlowStatistics) Reset()         { *m = FlowStatistics{} }
func (m *FlowStatistics) String() string { return proto.CompactTextString(m) }
func (*FlowStatistics) ProtoMessage()    {}
func (*FlowStatistics) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{25}
}

func (m *FlowStatistics) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FlowStatistics.Unmarshal(m, b)
}
func (m *FlowStatistics) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FlowStatistics.Marshal(b, m, deterministic)
}
func (m *FlowStatistics) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FlowStatistics.Merge(m, src)
}
func (m *FlowStatistics) XXX_Size() int {
	return xxx_messageInfo_FlowStatistics.Size(m)
}
func (m *FlowStatistics) XXX_DiscardUnknown() {
	xxx_messageInfo_FlowStatistics.DiscardUnknown(m)
}

var xxx_messageInfo_FlowStatistics proto.InternalMessageInfo

func (m *FlowStatistics) GetFlowId() uint32 {
	if m != nil {
		return m.FlowId
	}
	return 0
}

func (m *FlowStatistics) GetRxBytes() uint64 {
	if m != nil {
		return m.RxBytes
	}
	return 0
}

func (m *FlowStatistics) GetRxPackets() uint64 {
	if m != nil {
		return m.RxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTxBytes() uint64 {
	if m != nil {
		return m.TxBytes
	}
	return 0
}

func (m *FlowStatistics) GetTxPackets() uint64 {
	if m != nil {
		return m.TxPackets
	}
	return 0
}

func (m *FlowStatistics) GetTimestamp() uint32 {
	if m != nil {
		return m.Timestamp
	}
	return 0
}

type LosIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *LosIndication) Reset()         { *m = LosIndication{} }
func (m *LosIndication) String() string { return proto.CompactTextString(m) }
func (*LosIndication) ProtoMessage()    {}
func (*LosIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{26}
}

func (m *LosIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_LosIndication.Unmarshal(m, b)
}
func (m *LosIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_LosIndication.Marshal(b, m, deterministic)
}
func (m *LosIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_LosIndication.Merge(m, src)
}
func (m *LosIndication) XXX_Size() int {
	return xxx_messageInfo_LosIndication.Size(m)
}
func (m *LosIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_LosIndication.DiscardUnknown(m)
}

var xxx_messageInfo_LosIndication proto.InternalMessageInfo

func (m *LosIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *LosIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type DyingGaspIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *DyingGaspIndication) Reset()         { *m = DyingGaspIndication{} }
func (m *DyingGaspIndication) String() string { return proto.CompactTextString(m) }
func (*DyingGaspIndication) ProtoMessage()    {}
func (*DyingGaspIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{27}
}

func (m *DyingGaspIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_DyingGaspIndication.Unmarshal(m, b)
}
func (m *DyingGaspIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_DyingGaspIndication.Marshal(b, m, deterministic)
}
func (m *DyingGaspIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_DyingGaspIndication.Merge(m, src)
}
func (m *DyingGaspIndication) XXX_Size() int {
	return xxx_messageInfo_DyingGaspIndication.Size(m)
}
func (m *DyingGaspIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_DyingGaspIndication.DiscardUnknown(m)
}

var xxx_messageInfo_DyingGaspIndication proto.InternalMessageInfo

func (m *DyingGaspIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *DyingGaspIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *DyingGaspIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuAlarmIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	LosStatus            string   `protobuf:"bytes,3,opt,name=los_status,json=losStatus,proto3" json:"los_status,omitempty"`
	LobStatus            string   `protobuf:"bytes,4,opt,name=lob_status,json=lobStatus,proto3" json:"lob_status,omitempty"`
	LopcMissStatus       string   `protobuf:"bytes,5,opt,name=lopc_miss_status,json=lopcMissStatus,proto3" json:"lopc_miss_status,omitempty"`
	LopcMicErrorStatus   string   `protobuf:"bytes,6,opt,name=lopc_mic_error_status,json=lopcMicErrorStatus,proto3" json:"lopc_mic_error_status,omitempty"`
	LofiStatus           string   `protobuf:"bytes,7,opt,name=lofi_status,json=lofiStatus,proto3" json:"lofi_status,omitempty"`
	LoamiStatus          string   `protobuf:"bytes,8,opt,name=loami_status,json=loamiStatus,proto3" json:"loami_status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuAlarmIndication) Reset()         { *m = OnuAlarmIndication{} }
func (m *OnuAlarmIndication) String() string { return proto.CompactTextString(m) }
func (*OnuAlarmIndication) ProtoMessage()    {}
func (*OnuAlarmIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{28}
}

func (m *OnuAlarmIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuAlarmIndication.Unmarshal(m, b)
}
func (m *OnuAlarmIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuAlarmIndication.Marshal(b, m, deterministic)
}
func (m *OnuAlarmIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuAlarmIndication.Merge(m, src)
}
func (m *OnuAlarmIndication) XXX_Size() int {
	return xxx_messageInfo_OnuAlarmIndication.Size(m)
}
func (m *OnuAlarmIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuAlarmIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuAlarmIndication proto.InternalMessageInfo

func (m *OnuAlarmIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuAlarmIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuAlarmIndication) GetLosStatus() string {
	if m != nil {
		return m.LosStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLobStatus() string {
	if m != nil {
		return m.LobStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMissStatus() string {
	if m != nil {
		return m.LopcMissStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLopcMicErrorStatus() string {
	if m != nil {
		return m.LopcMicErrorStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLofiStatus() string {
	if m != nil {
		return m.LofiStatus
	}
	return ""
}

func (m *OnuAlarmIndication) GetLoamiStatus() string {
	if m != nil {
		return m.LoamiStatus
	}
	return ""
}

type OnuStartupFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuStartupFailureIndication) Reset()         { *m = OnuStartupFailureIndication{} }
func (m *OnuStartupFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuStartupFailureIndication) ProtoMessage()    {}
func (*OnuStartupFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{29}
}

func (m *OnuStartupFailureIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuStartupFailureIndication.Unmarshal(m, b)
}
func (m *OnuStartupFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuStartupFailureIndication.Marshal(b, m, deterministic)
}
func (m *OnuStartupFailureIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuStartupFailureIndication.Merge(m, src)
}
func (m *OnuStartupFailureIndication) XXX_Size() int {
	return xxx_messageInfo_OnuStartupFailureIndication.Size(m)
}
func (m *OnuStartupFailureIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuStartupFailureIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuStartupFailureIndication proto.InternalMessageInfo

func (m *OnuStartupFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuStartupFailureIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuStartupFailureIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuSignalDegradeIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalDegradeIndication) Reset()         { *m = OnuSignalDegradeIndication{} }
func (m *OnuSignalDegradeIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalDegradeIndication) ProtoMessage()    {}
func (*OnuSignalDegradeIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{30}
}

func (m *OnuSignalDegradeIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuSignalDegradeIndication.Unmarshal(m, b)
}
func (m *OnuSignalDegradeIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuSignalDegradeIndication.Marshal(b, m, deterministic)
}
func (m *OnuSignalDegradeIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuSignalDegradeIndication.Merge(m, src)
}
func (m *OnuSignalDegradeIndication) XXX_Size() int {
	return xxx_messageInfo_OnuSignalDegradeIndication.Size(m)
}
func (m *OnuSignalDegradeIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuSignalDegradeIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuSignalDegradeIndication proto.InternalMessageInfo

func (m *OnuSignalDegradeIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuSignalDegradeIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuSignalDegradeIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuSignalDegradeIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuDriftOfWindowIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	NewEqd               uint32   `protobuf:"fixed32,5,opt,name=new_eqd,json=newEqd,proto3" json:"new_eqd,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDriftOfWindowIndication) Reset()         { *m = OnuDriftOfWindowIndication{} }
func (m *OnuDriftOfWindowIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDriftOfWindowIndication) ProtoMessage()    {}
func (*OnuDriftOfWindowIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{31}
}

func (m *OnuDriftOfWindowIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuDriftOfWindowIndication.Unmarshal(m, b)
}
func (m *OnuDriftOfWindowIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuDriftOfWindowIndication.Marshal(b, m, deterministic)
}
func (m *OnuDriftOfWindowIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuDriftOfWindowIndication.Merge(m, src)
}
func (m *OnuDriftOfWindowIndication) XXX_Size() int {
	return xxx_messageInfo_OnuDriftOfWindowIndication.Size(m)
}
func (m *OnuDriftOfWindowIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuDriftOfWindowIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuDriftOfWindowIndication proto.InternalMessageInfo

func (m *OnuDriftOfWindowIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDriftOfWindowIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuDriftOfWindowIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuDriftOfWindowIndication) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

func (m *OnuDriftOfWindowIndication) GetNewEqd() uint32 {
	if m != nil {
		return m.NewEqd
	}
	return 0
}

type OnuLossOfOmciChannelIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuLossOfOmciChannelIndication) Reset()         { *m = OnuLossOfOmciChannelIndication{} }
func (m *OnuLossOfOmciChannelIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfOmciChannelIndication) ProtoMessage()    {}
func (*OnuLossOfOmciChannelIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{32}
}

func (m *OnuLossOfOmciChannelIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuLossOfOmciChannelIndication.Unmarshal(m, b)
}
func (m *OnuLossOfOmciChannelIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuLossOfOmciChannelIndication.Marshal(b, m, deterministic)
}
func (m *OnuLossOfOmciChannelIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuLossOfOmciChannelIndication.Merge(m, src)
}
func (m *OnuLossOfOmciChannelIndication) XXX_Size() int {
	return xxx_messageInfo_OnuLossOfOmciChannelIndication.Size(m)
}
func (m *OnuLossOfOmciChannelIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuLossOfOmciChannelIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuLossOfOmciChannelIndication proto.InternalMessageInfo

func (m *OnuLossOfOmciChannelIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuLossOfOmciChannelIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuLossOfOmciChannelIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuSignalsFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	InverseBitErrorRate  uint32   `protobuf:"fixed32,4,opt,name=inverse_bit_error_rate,json=inverseBitErrorRate,proto3" json:"inverse_bit_error_rate,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuSignalsFailureIndication) Reset()         { *m = OnuSignalsFailureIndication{} }
func (m *OnuSignalsFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuSignalsFailureIndication) ProtoMessage()    {}
func (*OnuSignalsFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{33}
}

func (m *OnuSignalsFailureIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuSignalsFailureIndication.Unmarshal(m, b)
}
func (m *OnuSignalsFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuSignalsFailureIndication.Marshal(b, m, deterministic)
}
func (m *OnuSignalsFailureIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuSignalsFailureIndication.Merge(m, src)
}
func (m *OnuSignalsFailureIndication) XXX_Size() int {
	return xxx_messageInfo_OnuSignalsFailureIndication.Size(m)
}
func (m *OnuSignalsFailureIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuSignalsFailureIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuSignalsFailureIndication proto.InternalMessageInfo

func (m *OnuSignalsFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuSignalsFailureIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuSignalsFailureIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuSignalsFailureIndication) GetInverseBitErrorRate() uint32 {
	if m != nil {
		return m.InverseBitErrorRate
	}
	return 0
}

type OnuTransmissionInterferenceWarning struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Drift                uint32   `protobuf:"fixed32,4,opt,name=drift,proto3" json:"drift,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuTransmissionInterferenceWarning) Reset()         { *m = OnuTransmissionInterferenceWarning{} }
func (m *OnuTransmissionInterferenceWarning) String() string { return proto.CompactTextString(m) }
func (*OnuTransmissionInterferenceWarning) ProtoMessage()    {}
func (*OnuTransmissionInterferenceWarning) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{34}
}

func (m *OnuTransmissionInterferenceWarning) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuTransmissionInterferenceWarning.Unmarshal(m, b)
}
func (m *OnuTransmissionInterferenceWarning) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuTransmissionInterferenceWarning.Marshal(b, m, deterministic)
}
func (m *OnuTransmissionInterferenceWarning) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuTransmissionInterferenceWarning.Merge(m, src)
}
func (m *OnuTransmissionInterferenceWarning) XXX_Size() int {
	return xxx_messageInfo_OnuTransmissionInterferenceWarning.Size(m)
}
func (m *OnuTransmissionInterferenceWarning) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuTransmissionInterferenceWarning.DiscardUnknown(m)
}

var xxx_messageInfo_OnuTransmissionInterferenceWarning proto.InternalMessageInfo

func (m *OnuTransmissionInterferenceWarning) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuTransmissionInterferenceWarning) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuTransmissionInterferenceWarning) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuTransmissionInterferenceWarning) GetDrift() uint32 {
	if m != nil {
		return m.Drift
	}
	return 0
}

type OnuActivationFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	FailReason           uint32   `protobuf:"fixed32,3,opt,name=fail_reason,json=failReason,proto3" json:"fail_reason,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuActivationFailureIndication) Reset()         { *m = OnuActivationFailureIndication{} }
func (m *OnuActivationFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuActivationFailureIndication) ProtoMessage()    {}
func (*OnuActivationFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{35}
}

func (m *OnuActivationFailureIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuActivationFailureIndication.Unmarshal(m, b)
}
func (m *OnuActivationFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuActivationFailureIndication.Marshal(b, m, deterministic)
}
func (m *OnuActivationFailureIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuActivationFailureIndication.Merge(m, src)
}
func (m *OnuActivationFailureIndication) XXX_Size() int {
	return xxx_messageInfo_OnuActivationFailureIndication.Size(m)
}
func (m *OnuActivationFailureIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuActivationFailureIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuActivationFailureIndication proto.InternalMessageInfo

func (m *OnuActivationFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuActivationFailureIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuActivationFailureIndication) GetFailReason() uint32 {
	if m != nil {
		return m.FailReason
	}
	return 0
}

type OnuLossOfKeySyncFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuLossOfKeySyncFailureIndication) Reset()         { *m = OnuLossOfKeySyncFailureIndication{} }
func (m *OnuLossOfKeySyncFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfKeySyncFailureIndication) ProtoMessage()    {}
func (*OnuLossOfKeySyncFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{36}
}

func (m *OnuLossOfKeySyncFailureIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Unmarshal(m, b)
}
func (m *OnuLossOfKeySyncFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Marshal(b, m, deterministic)
}
func (m *OnuLossOfKeySyncFailureIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Merge(m, src)
}
func (m *OnuLossOfKeySyncFailureIndication) XXX_Size() int {
	return xxx_messageInfo_OnuLossOfKeySyncFailureIndication.Size(m)
}
func (m *OnuLossOfKeySyncFailureIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuLossOfKeySyncFailureIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuLossOfKeySyncFailureIndication proto.InternalMessageInfo

func (m *OnuLossOfKeySyncFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuLossOfKeySyncFailureIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuLossOfKeySyncFailureIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type RdiErrorIndication struct {
	RdiErrorCount        uint64   `protobuf:"fixed64,1,opt,name=rdi_error_count,json=rdiErrorCount,proto3" json:"rdi_error_count,omitempty"`
	Status               string   `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *RdiErrorIndication) Reset()         { *m = RdiErrorIndication{} }
func (m *RdiErrorIndication) String() string { return proto.CompactTextString(m) }
func (*RdiErrorIndication) ProtoMessage()    {}
func (*RdiErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{37}
}

func (m *RdiErrorIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_RdiErrorIndication.Unmarshal(m, b)
}
func (m *RdiErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_RdiErrorIndication.Marshal(b, m, deterministic)
}
func (m *RdiErrorIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_RdiErrorIndication.Merge(m, src)
}
func (m *RdiErrorIndication) XXX_Size() int {
	return xxx_messageInfo_RdiErrorIndication.Size(m)
}
func (m *RdiErrorIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_RdiErrorIndication.DiscardUnknown(m)
}

var xxx_messageInfo_RdiErrorIndication proto.InternalMessageInfo

func (m *RdiErrorIndication) GetRdiErrorCount() uint64 {
	if m != nil {
		return m.RdiErrorCount
	}
	return 0
}

func (m *RdiErrorIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuItuPonStatsIndication struct {
	IntfId uint32 `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId  uint32 `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	// Types that are valid to be assigned to Stats:
	//	*OnuItuPonStatsIndication_RdiErrorInd
	Stats                isOnuItuPonStatsIndication_Stats `protobuf_oneof:"stats"`
	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
	XXX_unrecognized     []byte                           `json:"-"`
	XXX_sizecache        int32                            `json:"-"`
}

func (m *OnuItuPonStatsIndication) Reset()         { *m = OnuItuPonStatsIndication{} }
func (m *OnuItuPonStatsIndication) String() string { return proto.CompactTextString(m) }
func (*OnuItuPonStatsIndication) ProtoMessage()    {}
func (*OnuItuPonStatsIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{38}
}

func (m *OnuItuPonStatsIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuItuPonStatsIndication.Unmarshal(m, b)
}
func (m *OnuItuPonStatsIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuItuPonStatsIndication.Marshal(b, m, deterministic)
}
func (m *OnuItuPonStatsIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuItuPonStatsIndication.Merge(m, src)
}
func (m *OnuItuPonStatsIndication) XXX_Size() int {
	return xxx_messageInfo_OnuItuPonStatsIndication.Size(m)
}
func (m *OnuItuPonStatsIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuItuPonStatsIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuItuPonStatsIndication proto.InternalMessageInfo

func (m *OnuItuPonStatsIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuItuPonStatsIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

type isOnuItuPonStatsIndication_Stats interface {
	isOnuItuPonStatsIndication_Stats()
}

type OnuItuPonStatsIndication_RdiErrorInd struct {
	RdiErrorInd *RdiErrorIndication `protobuf:"bytes,3,opt,name=rdi_error_ind,json=rdiErrorInd,proto3,oneof"`
}

func (*OnuItuPonStatsIndication_RdiErrorInd) isOnuItuPonStatsIndication_Stats() {}

func (m *OnuItuPonStatsIndication) GetStats() isOnuItuPonStatsIndication_Stats {
	if m != nil {
		return m.Stats
	}
	return nil
}

func (m *OnuItuPonStatsIndication) GetRdiErrorInd() *RdiErrorIndication {
	if x, ok := m.GetStats().(*OnuItuPonStatsIndication_RdiErrorInd); ok {
		return x.RdiErrorInd
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*OnuItuPonStatsIndication) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*OnuItuPonStatsIndication_RdiErrorInd)(nil),
	}
}

type OnuProcessingErrorIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuProcessingErrorIndication) Reset()         { *m = OnuProcessingErrorIndication{} }
func (m *OnuProcessingErrorIndication) String() string { return proto.CompactTextString(m) }
func (*OnuProcessingErrorIndication) ProtoMessage()    {}
func (*OnuProcessingErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{39}
}

func (m *OnuProcessingErrorIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuProcessingErrorIndication.Unmarshal(m, b)
}
func (m *OnuProcessingErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuProcessingErrorIndication.Marshal(b, m, deterministic)
}
func (m *OnuProcessingErrorIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuProcessingErrorIndication.Merge(m, src)
}
func (m *OnuProcessingErrorIndication) XXX_Size() int {
	return xxx_messageInfo_OnuProcessingErrorIndication.Size(m)
}
func (m *OnuProcessingErrorIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuProcessingErrorIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuProcessingErrorIndication proto.InternalMessageInfo

func (m *OnuProcessingErrorIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuProcessingErrorIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

type OnuDeactivationFailureIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDeactivationFailureIndication) Reset()         { *m = OnuDeactivationFailureIndication{} }
func (m *OnuDeactivationFailureIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDeactivationFailureIndication) ProtoMessage()    {}
func (*OnuDeactivationFailureIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{40}
}

func (m *OnuDeactivationFailureIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuDeactivationFailureIndication.Unmarshal(m, b)
}
func (m *OnuDeactivationFailureIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuDeactivationFailureIndication.Marshal(b, m, deterministic)
}
func (m *OnuDeactivationFailureIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuDeactivationFailureIndication.Merge(m, src)
}
func (m *OnuDeactivationFailureIndication) XXX_Size() int {
	return xxx_messageInfo_OnuDeactivationFailureIndication.Size(m)
}
func (m *OnuDeactivationFailureIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuDeactivationFailureIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuDeactivationFailureIndication proto.InternalMessageInfo

func (m *OnuDeactivationFailureIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDeactivationFailureIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuDeactivationFailureIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuRemoteDefectIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	RdiErrors            uint64   `protobuf:"fixed64,3,opt,name=rdi_errors,json=rdiErrors,proto3" json:"rdi_errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuRemoteDefectIndication) Reset()         { *m = OnuRemoteDefectIndication{} }
func (m *OnuRemoteDefectIndication) String() string { return proto.CompactTextString(m) }
func (*OnuRemoteDefectIndication) ProtoMessage()    {}
func (*OnuRemoteDefectIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{41}
}

func (m *OnuRemoteDefectIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuRemoteDefectIndication.Unmarshal(m, b)
}
func (m *OnuRemoteDefectIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuRemoteDefectIndication.Marshal(b, m, deterministic)
}
func (m *OnuRemoteDefectIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuRemoteDefectIndication.Merge(m, src)
}
func (m *OnuRemoteDefectIndication) XXX_Size() int {
	return xxx_messageInfo_OnuRemoteDefectIndication.Size(m)
}
func (m *OnuRemoteDefectIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuRemoteDefectIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuRemoteDefectIndication proto.InternalMessageInfo

func (m *OnuRemoteDefectIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuRemoteDefectIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuRemoteDefectIndication) GetRdiErrors() uint64 {
	if m != nil {
		return m.RdiErrors
	}
	return 0
}

type OnuLossOfGEMChannelDelineationIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	DelineationErrors    uint32   `protobuf:"fixed32,4,opt,name=delineation_errors,json=delineationErrors,proto3" json:"delineation_errors,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuLossOfGEMChannelDelineationIndication) Reset() {
	*m = OnuLossOfGEMChannelDelineationIndication{}
}
func (m *OnuLossOfGEMChannelDelineationIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfGEMChannelDelineationIndication) ProtoMessage()    {}
func (*OnuLossOfGEMChannelDelineationIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{42}
}

func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Unmarshal(m, b)
}
func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Marshal(b, m, deterministic)
}
func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Merge(m, src)
}
func (m *OnuLossOfGEMChannelDelineationIndication) XXX_Size() int {
	return xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.Size(m)
}
func (m *OnuLossOfGEMChannelDelineationIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuLossOfGEMChannelDelineationIndication proto.InternalMessageInfo

func (m *OnuLossOfGEMChannelDelineationIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuLossOfGEMChannelDelineationIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuLossOfGEMChannelDelineationIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuLossOfGEMChannelDelineationIndication) GetDelineationErrors() uint32 {
	if m != nil {
		return m.DelineationErrors
	}
	return 0
}

type OnuPhysicalEquipmentErrorIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuPhysicalEquipmentErrorIndication) Reset()         { *m = OnuPhysicalEquipmentErrorIndication{} }
func (m *OnuPhysicalEquipmentErrorIndication) String() string { return proto.CompactTextString(m) }
func (*OnuPhysicalEquipmentErrorIndication) ProtoMessage()    {}
func (*OnuPhysicalEquipmentErrorIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{43}
}

func (m *OnuPhysicalEquipmentErrorIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Unmarshal(m, b)
}
func (m *OnuPhysicalEquipmentErrorIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Marshal(b, m, deterministic)
}
func (m *OnuPhysicalEquipmentErrorIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Merge(m, src)
}
func (m *OnuPhysicalEquipmentErrorIndication) XXX_Size() int {
	return xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.Size(m)
}
func (m *OnuPhysicalEquipmentErrorIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuPhysicalEquipmentErrorIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuPhysicalEquipmentErrorIndication proto.InternalMessageInfo

func (m *OnuPhysicalEquipmentErrorIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuPhysicalEquipmentErrorIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuPhysicalEquipmentErrorIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuLossOfAcknowledgementIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuLossOfAcknowledgementIndication) Reset()         { *m = OnuLossOfAcknowledgementIndication{} }
func (m *OnuLossOfAcknowledgementIndication) String() string { return proto.CompactTextString(m) }
func (*OnuLossOfAcknowledgementIndication) ProtoMessage()    {}
func (*OnuLossOfAcknowledgementIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{44}
}

func (m *OnuLossOfAcknowledgementIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Unmarshal(m, b)
}
func (m *OnuLossOfAcknowledgementIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Marshal(b, m, deterministic)
}
func (m *OnuLossOfAcknowledgementIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuLossOfAcknowledgementIndication.Merge(m, src)
}
func (m *OnuLossOfAcknowledgementIndication) XXX_Size() int {
	return xxx_messageInfo_OnuLossOfAcknowledgementIndication.Size(m)
}
func (m *OnuLossOfAcknowledgementIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuLossOfAcknowledgementIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuLossOfAcknowledgementIndication proto.InternalMessageInfo

func (m *OnuLossOfAcknowledgementIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuLossOfAcknowledgementIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuLossOfAcknowledgementIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

type OnuDifferentialReachExceededIndication struct {
	IntfId               uint32   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	Distance             uint32   `protobuf:"fixed32,4,opt,name=distance,proto3" json:"distance,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *OnuDifferentialReachExceededIndication) Reset() {
	*m = OnuDifferentialReachExceededIndication{}
}
func (m *OnuDifferentialReachExceededIndication) String() string { return proto.CompactTextString(m) }
func (*OnuDifferentialReachExceededIndication) ProtoMessage()    {}
func (*OnuDifferentialReachExceededIndication) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{45}
}

func (m *OnuDifferentialReachExceededIndication) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Unmarshal(m, b)
}
func (m *OnuDifferentialReachExceededIndication) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Marshal(b, m, deterministic)
}
func (m *OnuDifferentialReachExceededIndication) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuDifferentialReachExceededIndication.Merge(m, src)
}
func (m *OnuDifferentialReachExceededIndication) XXX_Size() int {
	return xxx_messageInfo_OnuDifferentialReachExceededIndication.Size(m)
}
func (m *OnuDifferentialReachExceededIndication) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuDifferentialReachExceededIndication.DiscardUnknown(m)
}

var xxx_messageInfo_OnuDifferentialReachExceededIndication proto.InternalMessageInfo

func (m *OnuDifferentialReachExceededIndication) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *OnuDifferentialReachExceededIndication) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuDifferentialReachExceededIndication) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *OnuDifferentialReachExceededIndication) GetDistance() uint32 {
	if m != nil {
		return m.Distance
	}
	return 0
}

type GroupMember struct {
	InterfaceId          uint32                    `protobuf:"varint,1,opt,name=interface_id,json=interfaceId,proto3" json:"interface_id,omitempty"`
	InterfaceType        GroupMember_InterfaceType `protobuf:"varint,2,opt,name=interface_type,json=interfaceType,proto3,enum=openolt.GroupMember_InterfaceType" json:"interface_type,omitempty"`
	GemPortId            uint32                    `protobuf:"varint,3,opt,name=gem_port_id,json=gemPortId,proto3" json:"gem_port_id,omitempty"`
	Priority             uint32                    `protobuf:"varint,4,opt,name=priority,proto3" json:"priority,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *GroupMember) Reset()         { *m = GroupMember{} }
func (m *GroupMember) String() string { return proto.CompactTextString(m) }
func (*GroupMember) ProtoMessage()    {}
func (*GroupMember) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{46}
}

func (m *GroupMember) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_GroupMember.Unmarshal(m, b)
}
func (m *GroupMember) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_GroupMember.Marshal(b, m, deterministic)
}
func (m *GroupMember) XXX_Merge(src proto.Message) {
	xxx_messageInfo_GroupMember.Merge(m, src)
}
func (m *GroupMember) XXX_Size() int {
	return xxx_messageInfo_GroupMember.Size(m)
}
func (m *GroupMember) XXX_DiscardUnknown() {
	xxx_messageInfo_GroupMember.DiscardUnknown(m)
}

var xxx_messageInfo_GroupMember proto.InternalMessageInfo

func (m *GroupMember) GetInterfaceId() uint32 {
	if m != nil {
		return m.InterfaceId
	}
	return 0
}

func (m *GroupMember) GetInterfaceType() GroupMember_InterfaceType {
	if m != nil {
		return m.InterfaceType
	}
	return GroupMember_PON
}

func (m *GroupMember) GetGemPortId() uint32 {
	if m != nil {
		return m.GemPortId
	}
	return 0
}

func (m *GroupMember) GetPriority() uint32 {
	if m != nil {
		return m.Priority
	}
	return 0
}

type Group struct {
	GroupId              uint32                    `protobuf:"varint,1,opt,name=group_id,json=groupId,proto3" json:"group_id,omitempty"`
	Command              Group_GroupMembersCommand `protobuf:"varint,2,opt,name=command,proto3,enum=openolt.Group_GroupMembersCommand" json:"command,omitempty"`
	Members              []*GroupMember            `protobuf:"bytes,3,rep,name=members,proto3" json:"members,omitempty"`
	Action               *Action                   `protobuf:"bytes,4,opt,name=action,proto3" json:"action,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *Group) Reset()         { *m = Group{} }
func (m *Group) String() string { return proto.CompactTextString(m) }
func (*Group) ProtoMessage()    {}
func (*Group) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{47}
}

func (m *Group) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Group.Unmarshal(m, b)
}
func (m *Group) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Group.Marshal(b, m, deterministic)
}
func (m *Group) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Group.Merge(m, src)
}
func (m *Group) XXX_Size() int {
	return xxx_messageInfo_Group.Size(m)
}
func (m *Group) XXX_DiscardUnknown() {
	xxx_messageInfo_Group.DiscardUnknown(m)
}

var xxx_messageInfo_Group proto.InternalMessageInfo

func (m *Group) GetGroupId() uint32 {
	if m != nil {
		return m.GroupId
	}
	return 0
}

func (m *Group) GetCommand() Group_GroupMembersCommand {
	if m != nil {
		return m.Command
	}
	return Group_ADD_MEMBERS
}

func (m *Group) GetMembers() []*GroupMember {
	if m != nil {
		return m.Members
	}
	return nil
}

func (m *Group) GetAction() *Action {
	if m != nil {
		return m.Action
	}
	return nil
}

type ValueParam struct {
	Onu                  *Onu                     `protobuf:"bytes,1,opt,name=onu,proto3" json:"onu,omitempty"`
	Value                extension.ValueType_Type `protobuf:"varint,2,opt,name=value,proto3,enum=extension.ValueType_Type" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *ValueParam) Reset()         { *m = ValueParam{} }
func (m *ValueParam) String() string { return proto.CompactTextString(m) }
func (*ValueParam) ProtoMessage()    {}
func (*ValueParam) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{48}
}

func (m *ValueParam) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ValueParam.Unmarshal(m, b)
}
func (m *ValueParam) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ValueParam.Marshal(b, m, deterministic)
}
func (m *ValueParam) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ValueParam.Merge(m, src)
}
func (m *ValueParam) XXX_Size() int {
	return xxx_messageInfo_ValueParam.Size(m)
}
func (m *ValueParam) XXX_DiscardUnknown() {
	xxx_messageInfo_ValueParam.DiscardUnknown(m)
}

var xxx_messageInfo_ValueParam proto.InternalMessageInfo

func (m *ValueParam) GetOnu() *Onu {
	if m != nil {
		return m.Onu
	}
	return nil
}

func (m *ValueParam) GetValue() extension.ValueType_Type {
	if m != nil {
		return m.Value
	}
	return extension.ValueType_EMPTY
}

type PonRxPowerData struct {
	IntfId               uint32                                   `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	OnuId                uint32                                   `protobuf:"fixed32,2,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	Status               string                                   `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"`
	FailReason           PonRxPowerData_RssiMeasurementFailReason `protobuf:"varint,4,opt,name=fail_reason,json=failReason,proto3,enum=openolt.PonRxPowerData_RssiMeasurementFailReason" json:"fail_reason,omitempty"`
	RxPowerMeanDbm       float64                                  `protobuf:"fixed64,5,opt,name=rx_power_mean_dbm,json=rxPowerMeanDbm,proto3" json:"rx_power_mean_dbm,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                 `json:"-"`
	XXX_unrecognized     []byte                                   `json:"-"`
	XXX_sizecache        int32                                    `json:"-"`
}

func (m *PonRxPowerData) Reset()         { *m = PonRxPowerData{} }
func (m *PonRxPowerData) String() string { return proto.CompactTextString(m) }
func (*PonRxPowerData) ProtoMessage()    {}
func (*PonRxPowerData) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{49}
}

func (m *PonRxPowerData) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_PonRxPowerData.Unmarshal(m, b)
}
func (m *PonRxPowerData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_PonRxPowerData.Marshal(b, m, deterministic)
}
func (m *PonRxPowerData) XXX_Merge(src proto.Message) {
	xxx_messageInfo_PonRxPowerData.Merge(m, src)
}
func (m *PonRxPowerData) XXX_Size() int {
	return xxx_messageInfo_PonRxPowerData.Size(m)
}
func (m *PonRxPowerData) XXX_DiscardUnknown() {
	xxx_messageInfo_PonRxPowerData.DiscardUnknown(m)
}

var xxx_messageInfo_PonRxPowerData proto.InternalMessageInfo

func (m *PonRxPowerData) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *PonRxPowerData) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *PonRxPowerData) GetStatus() string {
	if m != nil {
		return m.Status
	}
	return ""
}

func (m *PonRxPowerData) GetFailReason() PonRxPowerData_RssiMeasurementFailReason {
	if m != nil {
		return m.FailReason
	}
	return PonRxPowerData_FAIL_REASON_NONE
}

func (m *PonRxPowerData) GetRxPowerMeanDbm() float64 {
	if m != nil {
		return m.RxPowerMeanDbm
	}
	return 0
}

//
// contains the onu id, state of the onu and the information about the alarms on the onu.
// As of now only few alarms are added, any further information needed can be added to the structure.
type OnuObjectData struct {
	OnuId                uint32                    `protobuf:"fixed32,1,opt,name=onu_id,json=onuId,proto3" json:"onu_id,omitempty"`
	State                OnuObjectData_OnuObjState `protobuf:"varint,2,opt,name=state,proto3,enum=openolt.OnuObjectData_OnuObjState" json:"state,omitempty"`
	Losi                 AlarmState                `protobuf:"varint,3,opt,name=losi,proto3,enum=openolt.AlarmState" json:"losi,omitempty"`
	Lofi                 AlarmState                `protobuf:"varint,4,opt,name=lofi,proto3,enum=openolt.AlarmState" json:"lofi,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *OnuObjectData) Reset()         { *m = OnuObjectData{} }
func (m *OnuObjectData) String() string { return proto.CompactTextString(m) }
func (*OnuObjectData) ProtoMessage()    {}
func (*OnuObjectData) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{50}
}

func (m *OnuObjectData) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_OnuObjectData.Unmarshal(m, b)
}
func (m *OnuObjectData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_OnuObjectData.Marshal(b, m, deterministic)
}
func (m *OnuObjectData) XXX_Merge(src proto.Message) {
	xxx_messageInfo_OnuObjectData.Merge(m, src)
}
func (m *OnuObjectData) XXX_Size() int {
	return xxx_messageInfo_OnuObjectData.Size(m)
}
func (m *OnuObjectData) XXX_DiscardUnknown() {
	xxx_messageInfo_OnuObjectData.DiscardUnknown(m)
}

var xxx_messageInfo_OnuObjectData proto.InternalMessageInfo

func (m *OnuObjectData) GetOnuId() uint32 {
	if m != nil {
		return m.OnuId
	}
	return 0
}

func (m *OnuObjectData) GetState() OnuObjectData_OnuObjState {
	if m != nil {
		return m.State
	}
	return OnuObjectData_NOT_CONFIGURED
}

func (m *OnuObjectData) GetLosi() AlarmState {
	if m != nil {
		return m.Losi
	}
	return AlarmState_OFF
}

func (m *OnuObjectData) GetLofi() AlarmState {
	if m != nil {
		return m.Lofi
	}
	return AlarmState_OFF
}

//
// IntfObjectData has the interface Id and if there are any alarms active on that interface.
// Any further information needed from the interface object can be added to the structure.
type IntfObjectData struct {
	IntfId               uint32     `protobuf:"fixed32,1,opt,name=intf_id,json=intfId,proto3" json:"intf_id,omitempty"`
	Los                  AlarmState `protobuf:"varint,2,opt,name=los,proto3,enum=openolt.AlarmState" json:"los,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *IntfObjectData) Reset()         { *m = IntfObjectData{} }
func (m *IntfObjectData) String() string { return proto.CompactTextString(m) }
func (*IntfObjectData) ProtoMessage()    {}
func (*IntfObjectData) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{51}
}

func (m *IntfObjectData) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_IntfObjectData.Unmarshal(m, b)
}
func (m *IntfObjectData) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_IntfObjectData.Marshal(b, m, deterministic)
}
func (m *IntfObjectData) XXX_Merge(src proto.Message) {
	xxx_messageInfo_IntfObjectData.Merge(m, src)
}
func (m *IntfObjectData) XXX_Size() int {
	return xxx_messageInfo_IntfObjectData.Size(m)
}
func (m *IntfObjectData) XXX_DiscardUnknown() {
	xxx_messageInfo_IntfObjectData.DiscardUnknown(m)
}

var xxx_messageInfo_IntfObjectData proto.InternalMessageInfo

func (m *IntfObjectData) GetIntfId() uint32 {
	if m != nil {
		return m.IntfId
	}
	return 0
}

func (m *IntfObjectData) GetLos() AlarmState {
	if m != nil {
		return m.Los
	}
	return AlarmState_OFF
}

//
// ObjectDataResponse would have one of the responses of the requested object
type ObjectDataResponse struct {
	// Types that are valid to be assigned to Data:
	//	*ObjectDataResponse_OnuObjectData
	//	*ObjectDataResponse_IntfObjectData
	Data                 isObjectDataResponse_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *ObjectDataResponse) Reset()         { *m = ObjectDataResponse{} }
func (m *ObjectDataResponse) String() string { return proto.CompactTextString(m) }
func (*ObjectDataResponse) ProtoMessage()    {}
func (*ObjectDataResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{52}
}

func (m *ObjectDataResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ObjectDataResponse.Unmarshal(m, b)
}
func (m *ObjectDataResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ObjectDataResponse.Marshal(b, m, deterministic)
}
func (m *ObjectDataResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ObjectDataResponse.Merge(m, src)
}
func (m *ObjectDataResponse) XXX_Size() int {
	return xxx_messageInfo_ObjectDataResponse.Size(m)
}
func (m *ObjectDataResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_ObjectDataResponse.DiscardUnknown(m)
}

var xxx_messageInfo_ObjectDataResponse proto.InternalMessageInfo

type isObjectDataResponse_Data interface {
	isObjectDataResponse_Data()
}

type ObjectDataResponse_OnuObjectData struct {
	OnuObjectData *OnuObjectData `protobuf:"bytes,2,opt,name=onu_object_data,json=onuObjectData,proto3,oneof"`
}

type ObjectDataResponse_IntfObjectData struct {
	IntfObjectData *IntfObjectData `protobuf:"bytes,3,opt,name=intf_object_data,json=intfObjectData,proto3,oneof"`
}

func (*ObjectDataResponse_OnuObjectData) isObjectDataResponse_Data() {}

func (*ObjectDataResponse_IntfObjectData) isObjectDataResponse_Data() {}

func (m *ObjectDataResponse) GetData() isObjectDataResponse_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *ObjectDataResponse) GetOnuObjectData() *OnuObjectData {
	if x, ok := m.GetData().(*ObjectDataResponse_OnuObjectData); ok {
		return x.OnuObjectData
	}
	return nil
}

func (m *ObjectDataResponse) GetIntfObjectData() *IntfObjectData {
	if x, ok := m.GetData().(*ObjectDataResponse_IntfObjectData); ok {
		return x.IntfObjectData
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ObjectDataResponse) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ObjectDataResponse_OnuObjectData)(nil),
		(*ObjectDataResponse_IntfObjectData)(nil),
	}
}

//
// Object data request would contain request for one of the objects ONU/INTERFACE/SCHEDULERS/QUEUES
// As of now only ONU and INTERFACE objects are defined.
type ObjectDataRequest struct {
	// Types that are valid to be assigned to Data:
	//	*ObjectDataRequest_OnuObjectData
	//	*ObjectDataRequest_IntObjectData
	Data                 isObjectDataRequest_Data `protobuf_oneof:"data"`
	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
	XXX_unrecognized     []byte                   `json:"-"`
	XXX_sizecache        int32                    `json:"-"`
}

func (m *ObjectDataRequest) Reset()         { *m = ObjectDataRequest{} }
func (m *ObjectDataRequest) String() string { return proto.CompactTextString(m) }
func (*ObjectDataRequest) ProtoMessage()    {}
func (*ObjectDataRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{53}
}

func (m *ObjectDataRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_ObjectDataRequest.Unmarshal(m, b)
}
func (m *ObjectDataRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_ObjectDataRequest.Marshal(b, m, deterministic)
}
func (m *ObjectDataRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_ObjectDataRequest.Merge(m, src)
}
func (m *ObjectDataRequest) XXX_Size() int {
	return xxx_messageInfo_ObjectDataRequest.Size(m)
}
func (m *ObjectDataRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_ObjectDataRequest.DiscardUnknown(m)
}

var xxx_messageInfo_ObjectDataRequest proto.InternalMessageInfo

type isObjectDataRequest_Data interface {
	isObjectDataRequest_Data()
}

type ObjectDataRequest_OnuObjectData struct {
	OnuObjectData *Onu `protobuf:"bytes,1,opt,name=onu_object_data,json=onuObjectData,proto3,oneof"`
}

type ObjectDataRequest_IntObjectData struct {
	IntObjectData *Interface `protobuf:"bytes,2,opt,name=int_object_data,json=intObjectData,proto3,oneof"`
}

func (*ObjectDataRequest_OnuObjectData) isObjectDataRequest_Data() {}

func (*ObjectDataRequest_IntObjectData) isObjectDataRequest_Data() {}

func (m *ObjectDataRequest) GetData() isObjectDataRequest_Data {
	if m != nil {
		return m.Data
	}
	return nil
}

func (m *ObjectDataRequest) GetOnuObjectData() *Onu {
	if x, ok := m.GetData().(*ObjectDataRequest_OnuObjectData); ok {
		return x.OnuObjectData
	}
	return nil
}

func (m *ObjectDataRequest) GetIntObjectData() *Interface {
	if x, ok := m.GetData().(*ObjectDataRequest_IntObjectData); ok {
		return x.IntObjectData
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*ObjectDataRequest) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*ObjectDataRequest_OnuObjectData)(nil),
		(*ObjectDataRequest_IntObjectData)(nil),
	}
}

type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Empty) Reset()         { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage()    {}
func (*Empty) Descriptor() ([]byte, []int) {
	return fileDescriptor_c072e7aa0dfd74d5, []int{54}
}

func (m *Empty) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_Empty.Unmarshal(m, b)
}
func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_Empty.Marshal(b, m, deterministic)
}
func (m *Empty) XXX_Merge(src proto.Message) {
	xxx_messageInfo_Empty.Merge(m, src)
}
func (m *Empty) XXX_Size() int {
	return xxx_messageInfo_Empty.Size(m)
}
func (m *Empty) XXX_DiscardUnknown() {
	xxx_messageInfo_Empty.DiscardUnknown(m)
}

var xxx_messageInfo_Empty proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("openolt.AlarmState", AlarmState_name, AlarmState_value)
	proto.RegisterEnum("openolt.OnuIndication_ActivationFailReason", OnuIndication_ActivationFailReason_name, OnuIndication_ActivationFailReason_value)
	proto.RegisterEnum("openolt.IntfOperIndication_PONResourceRanges_Pool_PoolType", IntfOperIndication_PONResourceRanges_Pool_PoolType_name, IntfOperIndication_PONResourceRanges_Pool_PoolType_value)
	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_PoolType", DeviceInfo_DeviceResourceRanges_Pool_PoolType_name, DeviceInfo_DeviceResourceRanges_Pool_PoolType_value)
	proto.RegisterEnum("openolt.DeviceInfo_DeviceResourceRanges_Pool_SharingType", DeviceInfo_DeviceResourceRanges_Pool_SharingType_name, DeviceInfo_DeviceResourceRanges_Pool_SharingType_value)
	proto.RegisterEnum("openolt.GroupMember_InterfaceType", GroupMember_InterfaceType_name, GroupMember_InterfaceType_value)
	proto.RegisterEnum("openolt.Group_GroupMembersCommand", Group_GroupMembersCommand_name, Group_GroupMembersCommand_value)
	proto.RegisterEnum("openolt.PonRxPowerData_RssiMeasurementFailReason", PonRxPowerData_RssiMeasurementFailReason_name, PonRxPowerData_RssiMeasurementFailReason_value)
	proto.RegisterEnum("openolt.OnuObjectData_OnuObjState", OnuObjectData_OnuObjState_name, OnuObjectData_OnuObjState_value)
	proto.RegisterType((*Indication)(nil), "openolt.Indication")
	proto.RegisterType((*AlarmIndication)(nil), "openolt.AlarmIndication")
	proto.RegisterType((*OltIndication)(nil), "openolt.OltIndication")
	proto.RegisterType((*IntfIndication)(nil), "openolt.IntfIndication")
	proto.RegisterType((*OnuDiscIndication)(nil), "openolt.OnuDiscIndication")
	proto.RegisterType((*OnuIndication)(nil), "openolt.OnuIndication")
	proto.RegisterType((*IntfOperIndication)(nil), "openolt.IntfOperIndication")
	proto.RegisterType((*IntfOperIndication_PONResourceRanges)(nil), "openolt.IntfOperIndication.PONResourceRanges")
	proto.RegisterType((*IntfOperIndication_PONResourceRanges_Pool)(nil), "openolt.IntfOperIndication.PONResourceRanges.Pool")
	proto.RegisterType((*OmciIndication)(nil), "openolt.OmciIndication")
	proto.RegisterType((*PacketIndication)(nil), "openolt.PacketIndication")
	proto.RegisterType((*Interface)(nil), "openolt.Interface")
	proto.RegisterType((*Heartbeat)(nil), "openolt.Heartbeat")
	proto.RegisterType((*Onu)(nil), "openolt.Onu")
	proto.RegisterType((*OnuLogicalDistance)(nil), "openolt.OnuLogicalDistance")
	proto.RegisterType((*OmciMsg)(nil), "openolt.OmciMsg")
	proto.RegisterType((*OnuPacket)(nil), "openolt.OnuPacket")
	proto.RegisterType((*UplinkPacket)(nil), "openolt.UplinkPacket")
	proto.RegisterType((*DeviceInfo)(nil), "openolt.DeviceInfo")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges)(nil), "openolt.DeviceInfo.DeviceResourceRanges")
	proto.RegisterType((*DeviceInfo_DeviceResourceRanges_Pool)(nil), "openolt.DeviceInfo.DeviceResourceRanges.Pool")
	proto.RegisterType((*Classifier)(nil), "openolt.Classifier")
	proto.RegisterType((*ActionCmd)(nil), "openolt.ActionCmd")
	proto.RegisterType((*Action)(nil), "openolt.Action")
	proto.RegisterType((*Flow)(nil), "openolt.Flow")
	proto.RegisterMapType((map[uint32]bool)(nil), "openolt.Flow.GemportToAesEntry")
	proto.RegisterMapType((map[uint32]uint32)(nil), "openolt.Flow.PbitToGemportEntry")
	proto.RegisterType((*SerialNumber)(nil), "openolt.SerialNumber")
	proto.RegisterType((*PortStatistics)(nil), "openolt.PortStatistics")
	proto.RegisterType((*OnuStatistics)(nil), "openolt.OnuStatistics")
	proto.RegisterType((*GemPortStatistics)(nil), "openolt.GemPortStatistics")
	proto.RegisterType((*FlowStatistics)(nil), "openolt.FlowStatistics")
	proto.RegisterType((*LosIndication)(nil), "openolt.LosIndication")
	proto.RegisterType((*DyingGaspIndication)(nil), "openolt.DyingGaspIndication")
	proto.RegisterType((*OnuAlarmIndication)(nil), "openolt.OnuAlarmIndication")
	proto.RegisterType((*OnuStartupFailureIndication)(nil), "openolt.OnuStartupFailureIndication")
	proto.RegisterType((*OnuSignalDegradeIndication)(nil), "openolt.OnuSignalDegradeIndication")
	proto.RegisterType((*OnuDriftOfWindowIndication)(nil), "openolt.OnuDriftOfWindowIndication")
	proto.RegisterType((*OnuLossOfOmciChannelIndication)(nil), "openolt.OnuLossOfOmciChannelIndication")
	proto.RegisterType((*OnuSignalsFailureIndication)(nil), "openolt.OnuSignalsFailureIndication")
	proto.RegisterType((*OnuTransmissionInterferenceWarning)(nil), "openolt.OnuTransmissionInterferenceWarning")
	proto.RegisterType((*OnuActivationFailureIndication)(nil), "openolt.OnuActivationFailureIndication")
	proto.RegisterType((*OnuLossOfKeySyncFailureIndication)(nil), "openolt.OnuLossOfKeySyncFailureIndication")
	proto.RegisterType((*RdiErrorIndication)(nil), "openolt.RdiErrorIndication")
	proto.RegisterType((*OnuItuPonStatsIndication)(nil), "openolt.OnuItuPonStatsIndication")
	proto.RegisterType((*OnuProcessingErrorIndication)(nil), "openolt.OnuProcessingErrorIndication")
	proto.RegisterType((*OnuDeactivationFailureIndication)(nil), "openolt.OnuDeactivationFailureIndication")
	proto.RegisterType((*OnuRemoteDefectIndication)(nil), "openolt.OnuRemoteDefectIndication")
	proto.RegisterType((*OnuLossOfGEMChannelDelineationIndication)(nil), "openolt.OnuLossOfGEMChannelDelineationIndication")
	proto.RegisterType((*OnuPhysicalEquipmentErrorIndication)(nil), "openolt.OnuPhysicalEquipmentErrorIndication")
	proto.RegisterType((*OnuLossOfAcknowledgementIndication)(nil), "openolt.OnuLossOfAcknowledgementIndication")
	proto.RegisterType((*OnuDifferentialReachExceededIndication)(nil), "openolt.OnuDifferentialReachExceededIndication")
	proto.RegisterType((*GroupMember)(nil), "openolt.GroupMember")
	proto.RegisterType((*Group)(nil), "openolt.Group")
	proto.RegisterType((*ValueParam)(nil), "openolt.ValueParam")
	proto.RegisterType((*PonRxPowerData)(nil), "openolt.PonRxPowerData")
	proto.RegisterType((*OnuObjectData)(nil), "openolt.OnuObjectData")
	proto.RegisterType((*IntfObjectData)(nil), "openolt.IntfObjectData")
	proto.RegisterType((*ObjectDataResponse)(nil), "openolt.ObjectDataResponse")
	proto.RegisterType((*ObjectDataRequest)(nil), "openolt.ObjectDataRequest")
	proto.RegisterType((*Empty)(nil), "openolt.Empty")
}

func init() { proto.RegisterFile("voltha_protos/openolt.proto", fileDescriptor_c072e7aa0dfd74d5) }

var fileDescriptor_c072e7aa0dfd74d5 = []byte{
	// 5580 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x5c, 0x4b, 0x70, 0x23, 0x49,
	0x5a, 0x6e, 0xd9, 0xb2, 0x24, 0xff, 0x7a, 0x58, 0x4e, 0x3f, 0xda, 0x8f, 0x7e, 0xd6, 0xbc, 0x7a,
	0x67, 0x77, 0xdc, 0x6d, 0x4d, 0xbb, 0xa7, 0x7b, 0x76, 0xd9, 0x1d, 0xb7, 0x2d, 0xdb, 0x9a, 0xb1,
	0x2d, 0x53, 0x56, 0x77, 0xb3, 0xbb, 0x31, 0x14, 0xe5, 0xaa, 0x94, 0x5c, 0xeb, 0x52, 0x65, 0x4d,
	0x55, 0xca, 0x0f, 0x8e, 0x1b, 0x2c, 0x5c, 0xb8, 0x10, 0x1b, 0x10, 0x01, 0x9c, 0x60, 0xaf, 0x5c,
	0xb8, 0x11, 0xc1, 0x0d, 0x0e, 0x5c, 0xb8, 0x71, 0xe6, 0x46, 0x70, 0xe1, 0x40, 0x70, 0xe1, 0x44,
	0x00, 0x91, 0x8f, 0x7a, 0xa4, 0x4a, 0x76, 0xb7, 0x07, 0x03, 0x97, 0x0e, 0xe7, 0xff, 0x7f, 0xff,
	0xf7, 0xe7, 0xe3, 0xcf, 0x3f, 0xff, 0xaa, 0x4a, 0x35, 0x2c, 0x9f, 0x12, 0x97, 0x1e, 0x9b, 0x86,
	0x1f, 0x10, 0x4a, 0xc2, 0xc7, 0xc4, 0xc7, 0x1e, 0x71, 0xe9, 0x0a, 0x6f, 0xa2, 0xa2, 0x6c, 0x2e,
	0xdd, 0xe9, 0x11, 0xd2, 0x73, 0xf1, 0x63, 0xd3, 0x77, 0x1e, 0x9b, 0x9e, 0x47, 0xa8, 0x49, 0x1d,
	0xe2, 0x85, 0x02, 0xb6, 0xf4, 0x40, 0xe5, 0xa0, 0xd8, 0x3a, 0x66, 0x7f, 0x77, 0x1d, 0x17, 0x4b,
	0xc4, 0x3d, 0x15, 0x81, 0xcf, 0xa9, 0x61, 0x11, 0xaf, 0xeb, 0xf4, 0x2e, 0xd5, 0x63, 0x2f, 0x4c,
	0x3c, 0x68, 0x7f, 0x9f, 0x07, 0x68, 0x79, 0xb6, 0x63, 0x71, 0xbf, 0x68, 0x15, 0x8a, 0xc4, 0xa5,
	0x86, 0xe3, 0xd9, 0x0b, 0xb9, 0x07, 0xb9, 0x47, 0xe5, 0xc6, 0xfc, 0x4a, 0xd4, 0xf1, 0xb6, 0x4b,
	0x13, 0xe0, 0xce, 0x2d, 0xbd, 0x40, 0xb8, 0x00, 0x3d, 0x85, 0x92, 0xe3, 0xd1, 0x2e, 0xb7, 0x19,
	0xe3, 0x36, 0xb7, 0x63, 0x9b, 0x96, 0x47, 0xbb, 0x8a, 0x51, 0xd1, 0x11, 0x12, 0xb4, 0x0e, 0x55,
	0x6e, 0x45, 0x7c, 0x1c, 0x70, 0xd3, 0x71, 0x6e, 0xba, 0xac, 0x98, 0xb6, 0x7d, 0x1c, 0x28, 0xe6,
	0x65, 0x27, 0x91, 0xa2, 0x1f, 0x42, 0x85, 0x78, 0x03, 0xc3, 0x76, 0x42, 0x8b, 0x33, 0xe4, 0x39,
	0xc3, 0x52, 0xd2, 0x61, 0x6f, 0xb0, 0xe9, 0x84, 0x96, 0x42, 0x00, 0x24, 0x16, 0xf2, 0xb1, 0x7a,
	0x03, 0x6e, 0x3a, 0x31, 0x3c, 0x56, 0x6f, 0x30, 0x34, 0x56, 0x2e, 0x60, 0x63, 0x25, 0x7d, 0xcb,
	0xe1, 0x36, 0x85, 0xa1, 0xb1, 0xb6, 0xfb, 0x96, 0xa3, 0x8e, 0x95, 0x08, 0x09, 0x7a, 0x0a, 0x45,
	0xff, 0x44, 0x4c, 0x6a, 0x91, 0x1b, 0x2d, 0xc6, 0x46, 0x07, 0xa6, 0x75, 0x82, 0x87, 0xe6, 0xd5,
	0x3f, 0xe1, 0xf3, 0xfa, 0x1c, 0xc0, 0x27, 0x01, 0x35, 0x42, 0x6a, 0xd2, 0x70, 0xa1, 0x34, 0xe4,
	0xed, 0x80, 0x04, 0xf4, 0x90, 0x05, 0x4b, 0x48, 0x1d, 0x2b, 0xdc, 0xb9, 0xa5, 0x4f, 0xfa, 0x52,
	0x12, 0x32, 0xcb, 0xae, 0x4b, 0xce, 0xa4, 0xe5, 0xe4, 0x90, 0xe5, 0x96, 0x4b, 0xce, 0x54, 0xcb,
	0xae, 0x94, 0x84, 0xe8, 0x33, 0x98, 0x34, 0x5d, 0x33, 0xe8, 0xf3, 0xbe, 0x02, 0x37, 0x5c, 0x88,
	0x0d, 0xd7, 0x99, 0x46, 0xe9, 0x6a, 0xc9, 0x94, 0xa2, 0x97, 0x05, 0xc8, 0xdb, 0x26, 0x35, 0xb5,
	0x7f, 0xa9, 0xc2, 0xd4, 0x10, 0x8e, 0xcd, 0xb3, 0x4b, 0xc2, 0x91, 0x31, 0xb5, 0x4b, 0x42, 0x75,
	0xec, 0x2e, 0x17, 0xa0, 0x4d, 0xa8, 0xd9, 0x17, 0x8e, 0xd7, 0x33, 0x7a, 0x66, 0xe8, 0xa7, 0x22,
	0xeb, 0x4e, 0x6c, 0xb9, 0xc9, 0xd4, 0xdb, 0x66, 0xe8, 0x2b, 0xf6, 0x15, 0x3b, 0x25, 0x66, 0x31,
	0xc6, 0x16, 0x38, 0x19, 0xd1, 0x70, 0x8c, 0xb5, 0xbd, 0x41, 0x76, 0x50, 0x65, 0x92, 0x48, 0xd1,
	0x1b, 0x98, 0x65, 0x14, 0x21, 0x35, 0x03, 0x3a, 0xf0, 0x8d, 0xae, 0xe9, 0xb8, 0xa9, 0x58, 0x7b,
	0x3f, 0xcd, 0x74, 0x28, 0x30, 0x5b, 0xa6, 0xe3, 0x0e, 0x02, 0xac, 0x50, 0x4e, 0x13, 0x45, 0xcd,
	0x88, 0x7f, 0x02, 0xf3, 0x9c, 0xd8, 0xe9, 0x79, 0xa6, 0x6b, 0xd8, 0xb8, 0x17, 0x98, 0x36, 0x4e,
	0xc5, 0xe2, 0x7b, 0x0a, 0x35, 0x47, 0x6d, 0x0a, 0x90, 0xc2, 0x3c, 0x43, 0xb2, 0x5a, 0xf4, 0x53,
	0xb8, 0xcd, 0x37, 0x46, 0xe0, 0x74, 0xa9, 0x41, 0xba, 0xc6, 0x99, 0xe3, 0xd9, 0xe4, 0x2c, 0x15,
	0xb4, 0x0a, 0xf9, 0x26, 0x83, 0xb5, 0xbb, 0x6f, 0x38, 0x28, 0x43, 0x3e, 0xac, 0x45, 0x1d, 0x60,
	0xa3, 0x31, 0x5c, 0x12, 0x86, 0x46, 0xbc, 0x17, 0x44, 0x58, 0x7f, 0x94, 0xa6, 0xdd, 0x25, 0x61,
	0xd8, 0xee, 0xb2, 0x4d, 0xb1, 0x71, 0x6c, 0x7a, 0x1e, 0x76, 0x15, 0xea, 0x1a, 0x91, 0x08, 0xb9,
	0x45, 0xa2, 0x79, 0xe6, 0x43, 0x09, 0x93, 0x79, 0x2e, 0x8d, 0x98, 0x67, 0x81, 0xb9, 0x74, 0x9e,
	0x13, 0x35, 0x23, 0x6e, 0x8b, 0x24, 0x41, 0x9d, 0x33, 0xd1, 0x53, 0xb1, 0x1b, 0xbe, 0x9b, 0x26,
	0xec, 0x04, 0xa6, 0x17, 0xf6, 0x9d, 0x90, 0xa5, 0xc5, 0x96, 0x47, 0x71, 0xd0, 0xc5, 0x01, 0xf6,
	0x2c, 0xfc, 0xc6, 0x0c, 0x3c, 0xc7, 0xeb, 0xc9, 0xac, 0xd1, 0x71, 0xce, 0x78, 0x4f, 0x7f, 0x4b,
	0x4c, 0xae, 0x69, 0x51, 0xe7, 0x94, 0xfb, 0x4d, 0x3a, 0x0b, 0xd9, 0x59, 0x58, 0x8f, 0x61, 0xa3,
	0xfa, 0xcb, 0xc6, 0xac, 0x22, 0x84, 0x87, 0x05, 0xe6, 0xc1, 0x0f, 0x88, 0x85, 0xc3, 0x90, 0xed,
	0x02, 0x1c, 0x04, 0x44, 0x64, 0xc9, 0x32, 0x77, 0xf1, 0x41, 0xda, 0xc5, 0x41, 0x8c, 0x6b, 0x32,
	0x98, 0xe2, 0x60, 0x8e, 0x8c, 0xd2, 0x23, 0x0c, 0x8b, 0xc9, 0x1a, 0x76, 0x8d, 0xf0, 0xc2, 0xb3,
	0x92, 0x51, 0x54, 0xb8, 0x8b, 0x8f, 0xb3, 0x6b, 0xf9, 0x15, 0xbe, 0x38, 0xbc, 0xf0, 0xac, 0xcb,
	0x06, 0x22, 0x40, 0x11, 0x82, 0xb9, 0x79, 0x05, 0x73, 0x3c, 0xc1, 0xd2, 0x81, 0xe1, 0x13, 0x4f,
	0xa4, 0x23, 0xee, 0xa2, 0xca, 0x5d, 0x3c, 0x54, 0xd2, 0x2d, 0x1d, 0x1c, 0x10, 0x8f, 0x67, 0xa1,
	0xcc, 0x92, 0xaa, 0x3a, 0xe4, 0xc2, 0x1d, 0x1e, 0xde, 0x78, 0x68, 0x0d, 0x06, 0x81, 0xd8, 0x40,
	0x35, 0xce, 0xfe, 0x1d, 0x25, 0xc6, 0x53, 0xd8, 0x51, 0xfd, 0x67, 0xd3, 0x31, 0x1a, 0x83, 0xde,
	0x88, 0x41, 0x04, 0xb8, 0x4f, 0x28, 0x36, 0x6c, 0xdc, 0xc5, 0x96, 0x48, 0xe5, 0x53, 0xdc, 0x8d,
	0x96, 0x76, 0xa3, 0x73, 0xd0, 0x26, 0xc7, 0x28, 0xfc, 0x88, 0x64, 0x94, 0x28, 0x14, 0xc3, 0xe0,
	0x8b, 0xd0, 0xc3, 0x7d, 0xc3, 0xc6, 0xae, 0xe3, 0x61, 0x31, 0x1c, 0xc6, 0x5f, 0xe7, 0xfc, 0xab,
	0xd9, 0x75, 0xd8, 0x6e, 0xee, 0xc9, 0x2d, 0xb5, 0x99, 0x98, 0x28, 0xee, 0x16, 0xe4, 0x72, 0x6c,
	0xe3, 0xbe, 0x0a, 0x41, 0xa7, 0xf0, 0x80, 0xc7, 0xd6, 0xf1, 0x45, 0xe8, 0x58, 0xa6, 0x6b, 0xe0,
	0x6f, 0x06, 0x8e, 0xdf, 0xc7, 0x1e, 0x4d, 0xc5, 0xd8, 0x34, 0x77, 0xfc, 0x3d, 0x25, 0xc6, 0x24,
	0xbe, 0x19, 0xc1, 0xb3, 0xa1, 0xc6, 0x06, 0x73, 0x29, 0x0c, 0xfd, 0x14, 0x66, 0xd2, 0x11, 0x67,
	0x5a, 0x27, 0xdc, 0x15, 0xca, 0xee, 0x46, 0x31, 0xc6, 0x75, 0xeb, 0xc4, 0x23, 0x67, 0x2e, 0xb6,
	0x7b, 0x98, 0xf1, 0x28, 0x9e, 0xa6, 0x48, 0x0a, 0xc5, 0xc8, 0x09, 0x2c, 0x8b, 0x42, 0xa0, 0xdb,
	0x35, 0x02, 0x6c, 0x5a, 0xc7, 0x06, 0x3e, 0xb7, 0x30, 0xb6, 0xb1, 0xcd, 0x9d, 0xcc, 0x70, 0x27,
	0x8f, 0xd5, 0xba, 0xa0, 0xcb, 0x37, 0x39, 0x75, 0x4c, 0x57, 0x67, 0x16, 0x4d, 0x69, 0xa0, 0x38,
	0xba, 0x4d, 0x04, 0x72, 0x18, 0x11, 0x9f, 0x76, 0x2b, 0x50, 0x55, 0xaa, 0x22, 0x74, 0x17, 0x80,
	0x17, 0x34, 0x2c, 0xd4, 0x31, 0x3f, 0xed, 0x26, 0xf5, 0x49, 0x26, 0x61, 0xc1, 0x8b, 0xb5, 0x1d,
	0xa8, 0xa9, 0x15, 0x11, 0xba, 0x0d, 0x45, 0x51, 0x3c, 0x89, 0xb3, 0xb1, 0xa8, 0x17, 0x78, 0x81,
	0x64, 0x0f, 0x31, 0x8d, 0x0d, 0x33, 0x1d, 0xc3, 0x74, 0xa6, 0xbc, 0xb9, 0x9c, 0xec, 0x73, 0xa8,
	0x86, 0x38, 0x70, 0x4c, 0xd7, 0xf0, 0x06, 0xfd, 0x23, 0x1c, 0xc8, 0xd3, 0x74, 0x2e, 0x9e, 0x92,
	0x43, 0xae, 0xdd, 0xe7, 0x4a, 0xbd, 0x12, 0xa6, 0x5a, 0xda, 0x2f, 0xf3, 0x50, 0x55, 0xca, 0xa1,
	0xcb, 0xdd, 0xcc, 0x41, 0x81, 0xef, 0x77, 0x71, 0x5a, 0x17, 0xf5, 0x09, 0xb6, 0x77, 0x87, 0x87,
	0x32, 0x3e, 0x34, 0x14, 0x74, 0x1f, 0xca, 0xa6, 0xdd, 0x77, 0x3c, 0xa9, 0x9f, 0xe0, 0x7a, 0xe0,
	0x22, 0x01, 0xc8, 0xf4, 0x3e, 0xff, 0xce, 0xbd, 0x47, 0xbb, 0x50, 0xe6, 0x89, 0x2d, 0xc0, 0x66,
	0x48, 0x3c, 0x7e, 0xfc, 0xd5, 0xd4, 0x78, 0x4b, 0x06, 0xb6, 0xa2, 0xa6, 0x62, 0x9d, 0x9b, 0xe8,
	0xd0, 0x8d, 0xff, 0xd6, 0x7e, 0x6f, 0x0c, 0x66, 0x47, 0x81, 0xd0, 0x7b, 0x70, 0xbf, 0xbd, 0xff,
	0xca, 0x58, 0xdf, 0xe8, 0xb4, 0x5e, 0xaf, 0x77, 0x5a, 0xed, 0x7d, 0x63, 0x6b, 0xbd, 0xb5, 0x6b,
	0xe8, 0xcd, 0xf5, 0xc3, 0xf6, 0xbe, 0xb1, 0xdf, 0xde, 0x6f, 0xd6, 0x6f, 0xa1, 0x0f, 0x41, 0xbb,
	0x02, 0xa4, 0xaf, 0xef, 0x6f, 0xb7, 0xf6, 0xb7, 0xeb, 0x39, 0xf4, 0x0c, 0x1a, 0x57, 0xe0, 0x0e,
	0xd6, 0x0f, 0x0f, 0xdf, 0xb4, 0xf5, 0x4d, 0x63, 0xfd, 0x55, 0x67, 0xa7, 0xb9, 0xdf, 0x69, 0x6d,
	0x70, 0x4c, 0x7d, 0x0c, 0x69, 0x70, 0xef, 0x0a, 0xbb, 0xdd, 0xf6, 0x61, 0x7d, 0x1c, 0x3d, 0x84,
	0xbb, 0xa3, 0x30, 0x5c, 0xb6, 0xbb, 0xae, 0xef, 0xd5, 0xf3, 0x97, 0x8d, 0xe5, 0xf0, 0x4d, 0xab,
	0xb3, 0xb1, 0x63, 0xb4, 0x5f, 0x37, 0xf5, 0xfa, 0x84, 0xf6, 0xf3, 0x3c, 0xa0, 0x6c, 0x85, 0x8e,
	0x10, 0xe4, 0xe9, 0x85, 0x1f, 0x45, 0x3e, 0xff, 0x3b, 0x1d, 0x2e, 0x63, 0x57, 0x84, 0x78, 0x26,
	0x2e, 0x66, 0x61, 0x22, 0xf4, 0x31, 0x16, 0xb5, 0x56, 0x51, 0x17, 0x0d, 0x74, 0x0f, 0x80, 0x3d,
	0x05, 0x79, 0xc4, 0x25, 0xbd, 0x8b, 0x28, 0x58, 0x12, 0x09, 0x6a, 0x42, 0x21, 0x30, 0xbd, 0x1e,
	0x0e, 0x65, 0xa9, 0xf3, 0xc9, 0x15, 0x0f, 0x14, 0x2b, 0x07, 0xed, 0x7d, 0x1d, 0x87, 0x64, 0x10,
	0x58, 0x58, 0xe7, 0x46, 0xba, 0x34, 0x5e, 0xfa, 0xf3, 0x31, 0x98, 0xce, 0x68, 0xd1, 0x0e, 0x4c,
	0xf8, 0x84, 0xb8, 0xe1, 0xc2, 0xf8, 0x83, 0xf1, 0x47, 0xe5, 0x46, 0xe3, 0x5a, 0xdc, 0x2b, 0x07,
	0x84, 0xb8, 0xba, 0x20, 0x58, 0xfa, 0x9b, 0x1c, 0xe4, 0x59, 0x1b, 0xb5, 0x53, 0x33, 0x56, 0x6b,
	0x7c, 0xff, 0xfa, 0x8c, 0xfc, 0x9f, 0xce, 0x85, 0x8f, 0xe5, 0x74, 0xb3, 0x69, 0x63, 0xa5, 0x26,
	0x9f, 0x50, 0x36, 0x6d, 0xac, 0x81, 0xea, 0x30, 0x8e, 0xbd, 0x68, 0x2a, 0xd9, 0x9f, 0xda, 0x3a,
	0x94, 0x22, 0x4b, 0x04, 0x50, 0x60, 0x4b, 0xde, 0xda, 0xac, 0xdf, 0x42, 0x15, 0x28, 0xad, 0xef,
	0xee, 0xb6, 0x37, 0x58, 0x2b, 0x87, 0x6a, 0x00, 0xdb, 0xcd, 0xbd, 0x83, 0xb6, 0xde, 0x61, 0xed,
	0x31, 0x54, 0x86, 0xe2, 0xd6, 0x6e, 0xfb, 0x0d, 0x6b, 0x8c, 0x6b, 0x3a, 0xd4, 0xd4, 0x87, 0x9e,
	0x6b, 0xa7, 0x86, 0x3a, 0x8c, 0xfb, 0x27, 0xa2, 0xab, 0x15, 0x9d, 0xfd, 0xa9, 0xfd, 0x5b, 0x0e,
	0xea, 0xc3, 0x0f, 0x45, 0x68, 0x19, 0x26, 0x39, 0x2d, 0x9f, 0x29, 0xb1, 0xe6, 0xfc, 0x99, 0xb3,
	0x33, 0x14, 0x5f, 0x97, 0xf9, 0x2c, 0xa5, 0x7d, 0xce, 0x41, 0x61, 0xe0, 0x39, 0x4c, 0x3c, 0x29,
	0xc4, 0x03, 0xcf, 0x11, 0xd1, 0xd8, 0xc3, 0x7d, 0xfe, 0xc4, 0x15, 0xf7, 0x72, 0x52, 0x4a, 0x5a,
	0x36, 0xf3, 0xc2, 0x9f, 0xa9, 0x1c, 0x5b, 0x4e, 0x6c, 0x81, 0x35, 0x85, 0x82, 0x1b, 0x79, 0x84,
	0x47, 0x5c, 0x51, 0x2f, 0xb0, 0xe6, 0x3e, 0x41, 0xf3, 0x50, 0xb0, 0x08, 0x39, 0x71, 0x30, 0xaf,
	0x8e, 0x0b, 0xba, 0x6c, 0x45, 0x63, 0xce, 0x27, 0x63, 0x7e, 0x1f, 0x26, 0x45, 0xdd, 0x69, 0x5a,
	0x97, 0x0f, 0x47, 0xfb, 0x01, 0x4c, 0xee, 0x60, 0x33, 0xa0, 0x47, 0xd8, 0xa4, 0xe8, 0x31, 0xcc,
	0x1c, 0x47, 0x0d, 0x51, 0x35, 0xd3, 0x41, 0x80, 0xa5, 0x05, 0x8a, 0x55, 0x87, 0x91, 0x46, 0xfb,
	0x8b, 0x1c, 0x8c, 0xb7, 0xbd, 0xc1, 0xb5, 0x57, 0x28, 0x93, 0x7c, 0xc7, 0xdf, 0x3d, 0xf9, 0xb2,
	0x91, 0x3a, 0x41, 0x14, 0x74, 0xbe, 0x13, 0xa0, 0x8f, 0x60, 0x8a, 0xf4, 0x2d, 0xcb, 0xc0, 0x9e,
	0x15, 0x5c, 0xf8, 0x6c, 0x6d, 0xf9, 0x72, 0x96, 0xf4, 0x1a, 0x13, 0x37, 0x63, 0xa9, 0xf6, 0x97,
	0x39, 0x40, 0xbc, 0x18, 0xe8, 0xb1, 0x7a, 0x62, 0xd3, 0x09, 0xa9, 0xe9, 0x59, 0xf8, 0xda, 0xbd,
	0x7f, 0x01, 0x8b, 0xae, 0xa0, 0x30, 0xe4, 0xab, 0x02, 0xce, 0x63, 0xfc, 0x36, 0x0e, 0x88, 0x5c,
	0xc7, 0x79, 0x09, 0x10, 0xc7, 0x29, 0x57, 0xff, 0x04, 0x07, 0x04, 0x3d, 0x81, 0xd9, 0x51, 0xa6,
	0x72, 0x34, 0x28, 0x6b, 0xa5, 0x7d, 0x05, 0x45, 0xb6, 0x1d, 0xf6, 0xc2, 0xde, 0x0d, 0xec, 0x83,
	0x5f, 0xe4, 0x60, 0x92, 0x15, 0x5e, 0x7c, 0x2b, 0x5c, 0x9b, 0x2f, 0x15, 0x94, 0x79, 0x25, 0x28,
	0xd5, 0x28, 0x9f, 0x18, 0x8e, 0xf2, 0x6c, 0x3f, 0x5e, 0x40, 0xe5, 0x95, 0xef, 0x3a, 0xde, 0xc9,
	0xdb, 0x7a, 0x22, 0x4d, 0xc7, 0x12, 0xd3, 0x3f, 0x2d, 0x02, 0x6c, 0xe2, 0x53, 0xc7, 0xc2, 0x2d,
	0xaf, 0xcb, 0xf7, 0xc3, 0x29, 0xf6, 0x6c, 0x12, 0xc8, 0xd3, 0x41, 0xb6, 0x58, 0xc2, 0xea, 0x13,
	0x1b, 0xbb, 0xb2, 0xc8, 0x11, 0x0d, 0xf4, 0x1d, 0xa8, 0x1f, 0x9b, 0x81, 0x7d, 0x66, 0x06, 0xd8,
	0x38, 0xc5, 0x01, 0x7b, 0x36, 0x93, 0x47, 0xc4, 0x54, 0x24, 0x7f, 0x2d, 0xc4, 0x0c, 0xda, 0x75,
	0x82, 0xbe, 0x02, 0xcd, 0x0b, 0x68, 0x24, 0x8f, 0xa0, 0xcb, 0x30, 0x69, 0xf3, 0x1e, 0xb1, 0xfe,
	0xd7, 0x45, 0x22, 0x11, 0x82, 0x96, 0xcd, 0x56, 0x5c, 0x2a, 0xd5, 0x88, 0x9f, 0xe6, 0x38, 0x24,
	0x74, 0xe9, 0x70, 0x47, 0xab, 0x30, 0xeb, 0x07, 0xf8, 0xd4, 0x21, 0x83, 0xd0, 0xbd, 0x30, 0x2c,
	0xe2, 0x79, 0xd8, 0xa2, 0x58, 0x54, 0x9c, 0x25, 0x7d, 0x26, 0xd1, 0x6d, 0x44, 0x2a, 0xd6, 0x03,
	0xf6, 0x2c, 0xc4, 0xe6, 0x3b, 0xe4, 0x8f, 0x5a, 0x45, 0xbd, 0xe4, 0x13, 0xef, 0x80, 0xb5, 0xd1,
	0x17, 0xf1, 0xe1, 0x35, 0xc5, 0x0f, 0x98, 0x47, 0xc9, 0xeb, 0x8e, 0x78, 0x1e, 0xe5, 0x9f, 0x97,
	0x9c, 0x5b, 0x7f, 0x98, 0x87, 0xd9, 0x51, 0x00, 0xb4, 0x18, 0xbd, 0xa5, 0xb3, 0xc3, 0x85, 0xdc,
	0x83, 0xf1, 0x47, 0x45, 0xf9, 0x2a, 0xce, 0x0e, 0x87, 0x8e, 0xd4, 0xb1, 0xcc, 0x91, 0xba, 0xa1,
	0x9e, 0x7a, 0x9f, 0xbc, 0x6b, 0xa7, 0x94, 0x03, 0xef, 0x3f, 0xc6, 0xe4, 0x81, 0xf7, 0xa5, 0x72,
	0xe0, 0x3d, 0xbb, 0x16, 0xd9, 0xf0, 0x59, 0x77, 0x08, 0xc5, 0xf0, 0xd8, 0x0c, 0x1c, 0xaf, 0xc7,
	0xbb, 0x5d, 0x6b, 0xbc, 0xb8, 0x1e, 0xdd, 0xa1, 0x30, 0xe6, 0x8c, 0x11, 0xd3, 0xff, 0xe5, 0x01,
	0x7a, 0x0c, 0xe5, 0x54, 0x17, 0xd0, 0x3c, 0xa0, 0xcd, 0xe6, 0x26, 0x2b, 0xe8, 0x9a, 0x9b, 0xc6,
	0x41, 0x53, 0x37, 0x5a, 0xfb, 0x9d, 0xad, 0xfa, 0x2d, 0x74, 0x1f, 0x96, 0x0f, 0x77, 0xd6, 0xf5,
	0xe6, 0xa6, 0xf1, 0xf2, 0xc7, 0xc6, 0xfa, 0xee, 0x2e, 0x97, 0xf3, 0x3f, 0x3a, 0xcd, 0x8d, 0x9d,
	0x7a, 0x0e, 0x3d, 0x80, 0x3b, 0x23, 0x00, 0x87, 0xeb, 0x7b, 0x4d, 0x81, 0x18, 0xfb, 0x32, 0x5f,
	0x9a, 0xa8, 0x57, 0xbe, 0xcc, 0x97, 0xaa, 0xf5, 0xda, 0x97, 0xf9, 0x52, 0xad, 0x3e, 0xa5, 0xfd,
	0xce, 0x38, 0xc0, 0x86, 0x6b, 0x86, 0xa1, 0xd3, 0x75, 0x70, 0xc0, 0x13, 0x89, 0x41, 0xfd, 0x78,
	0x5b, 0x4f, 0x90, 0x8e, 0xef, 0xd8, 0x68, 0x06, 0x26, 0x88, 0x71, 0x1a, 0xa7, 0x97, 0x3c, 0x79,
	0xed, 0xf0, 0xa4, 0xe3, 0x08, 0xac, 0x9c, 0x22, 0x27, 0xc2, 0x3a, 0x1c, 0x2b, 0x26, 0x29, 0xef,
	0x30, 0xec, 0x6d, 0x28, 0x12, 0xc3, 0x3f, 0x72, 0x68, 0x28, 0xb3, 0x4d, 0x81, 0x1c, 0xb0, 0x16,
	0x4f, 0x24, 0x52, 0x21, 0xcf, 0x4d, 0x47, 0x28, 0x16, 0xa1, 0x84, 0xe9, 0xb1, 0x38, 0xeb, 0x8b,
	0x5c, 0x53, 0xc4, 0xf4, 0x38, 0x3a, 0xea, 0xed, 0x90, 0x1a, 0x7d, 0xd3, 0xe2, 0x47, 0x7a, 0x45,
	0x2f, 0xd8, 0x21, 0xdd, 0x33, 0x2d, 0xa6, 0x08, 0x03, 0x8b, 0x2b, 0x26, 0x85, 0x22, 0x0c, 0x2c,
	0xa6, 0x60, 0x61, 0xef, 0x8b, 0x97, 0xdf, 0xfc, 0xf5, 0x0c, 0x0b, 0x7b, 0xff, 0x80, 0xbf, 0x82,
	0x9f, 0x03, 0x66, 0x6d, 0x38, 0x3e, 0x7f, 0xa9, 0x52, 0xd4, 0x27, 0xec, 0x90, 0xb6, 0x7c, 0x26,
	0x66, 0x54, 0x8e, 0x2f, 0x77, 0xe7, 0x44, 0x18, 0x58, 0x2d, 0x9f, 0x11, 0x31, 0x31, 0xdb, 0xb7,
	0xfc, 0xf5, 0x45, 0x51, 0x67, 0x1e, 0xd9, 0xb6, 0x65, 0x2a, 0x46, 0xc4, 0x55, 0x35, 0xa1, 0xb2,
	0x43, 0xca, 0x55, 0x0f, 0xa0, 0xe2, 0x9f, 0x50, 0x83, 0x9a, 0x3d, 0x31, 0x9e, 0x29, 0xb1, 0xb9,
	0xfc, 0x13, 0xda, 0x31, 0xf9, 0x9a, 0x6b, 0xbf, 0x18, 0x87, 0x49, 0xf6, 0x48, 0x41, 0xbc, 0x8d,
	0xbe, 0x8d, 0x34, 0xa8, 0x9a, 0xb6, 0x6d, 0x90, 0x01, 0xc5, 0x01, 0xb3, 0xe2, 0x8b, 0x51, 0xd2,
	0xcb, 0xa6, 0x6d, 0xb7, 0x99, 0xac, 0x63, 0xf6, 0xd0, 0x23, 0xa8, 0x07, 0xb8, 0x4f, 0x4e, 0x71,
	0x0a, 0x36, 0x26, 0x0e, 0x51, 0x21, 0x8f, 0x91, 0x0f, 0xa0, 0x42, 0x03, 0xd3, 0x37, 0x28, 0x31,
	0x8e, 0x49, 0x28, 0x02, 0xba, 0xa4, 0x03, 0x93, 0x75, 0xc8, 0x0e, 0x09, 0x29, 0xfa, 0x1e, 0xa0,
	0x00, 0xf7, 0xcd, 0xe0, 0x44, 0x72, 0x89, 0xf5, 0xc8, 0x73, 0x5c, 0x5d, 0x68, 0x38, 0x9b, 0x58,
	0x99, 0x04, 0xed, 0x78, 0x5e, 0x8c, 0x9e, 0x48, 0xa3, 0x5b, 0x4c, 0x21, 0xd0, 0x72, 0x2c, 0x02,
	0xca, 0x3a, 0x59, 0x88, 0xc7, 0xc2, 0x51, 0xea, 0x58, 0x12, 0x58, 0x31, 0x3d, 0x96, 0x18, 0xb9,
	0x02, 0x33, 0x34, 0x30, 0xbd, 0xd0, 0x35, 0x69, 0x1a, 0x5c, 0xe2, 0xe0, 0xe9, 0x58, 0x35, 0x1a,
	0x9f, 0x4c, 0xd4, 0xe4, 0x10, 0x3e, 0x9a, 0x2b, 0xed, 0xaf, 0x72, 0x50, 0x10, 0xeb, 0x80, 0xde,
	0x87, 0x71, 0xab, 0x1f, 0xbd, 0xab, 0x46, 0xc9, 0xeb, 0xef, 0x68, 0x95, 0x74, 0xa6, 0x1e, 0xbd,
	0x33, 0x52, 0xd1, 0x3e, 0xae, 0x44, 0x7b, 0xb2, 0xbd, 0xf2, 0x43, 0xdb, 0x4b, 0x6c, 0x99, 0x09,
	0x75, 0xcb, 0x8c, 0xde, 0x19, 0xc9, 0xbe, 0x2b, 0xa6, 0xf6, 0x9d, 0xf6, 0x77, 0x05, 0xc8, 0x6f,
	0xb9, 0xe4, 0x0c, 0xbd, 0x0f, 0x35, 0xd3, 0xb2, 0x70, 0x18, 0x1a, 0xe9, 0x23, 0x7a, 0x4a, 0xaf,
	0x08, 0x69, 0x6b, 0x54, 0xc9, 0x30, 0x95, 0x2d, 0x8b, 0xcb, 0x42, 0x2c, 0xca, 0xe2, 0xa1, 0xba,
	0xb7, 0x10, 0xd7, 0xbd, 0x1f, 0xc3, 0x74, 0x78, 0xd1, 0xef, 0x63, 0x1a, 0x38, 0x96, 0x11, 0x41,
	0x10, 0x87, 0x4c, 0xc5, 0x8a, 0x2d, 0x81, 0x5d, 0x06, 0xfe, 0x8d, 0x41, 0xec, 0x01, 0x71, 0x34,
	0x97, 0x98, 0x80, 0x6f, 0xea, 0x45, 0x28, 0x99, 0xae, 0x4b, 0x2c, 0x66, 0x0f, 0xdc, 0x75, 0x91,
	0xb7, 0x5b, 0x36, 0xfa, 0x10, 0xa6, 0x3c, 0x4c, 0xcf, 0x08, 0x8f, 0x38, 0x31, 0xa2, 0x09, 0x8e,
	0xa8, 0x4a, 0x71, 0x2b, 0x7e, 0x92, 0x4c, 0x55, 0x35, 0x05, 0x0e, 0x49, 0x55, 0x35, 0x9f, 0x02,
	0x58, 0x71, 0xa6, 0x93, 0xef, 0xaa, 0x67, 0xe2, 0x75, 0x4d, 0x92, 0xa0, 0x9e, 0x82, 0xa1, 0x8f,
	0xa0, 0x60, 0xf2, 0x15, 0x97, 0xef, 0xa0, 0xa7, 0x86, 0x02, 0x41, 0x97, 0x6a, 0xb4, 0x04, 0x25,
	0x3f, 0x70, 0x48, 0xe0, 0xd0, 0x0b, 0x1e, 0x5e, 0x53, 0x7a, 0xdc, 0x4e, 0x3d, 0x03, 0x54, 0x94,
	0x67, 0x80, 0x54, 0x7d, 0x56, 0x55, 0xea, 0xb3, 0x45, 0x28, 0xf5, 0x02, 0x32, 0xf0, 0xd9, 0x38,
	0x64, 0x2e, 0xe1, 0x6d, 0x31, 0x19, 0xe9, 0xef, 0x7f, 0x0c, 0x31, 0xc5, 0x11, 0x55, 0x26, 0x3e,
	0x10, 0xd2, 0x96, 0x8d, 0x3e, 0x80, 0x5a, 0x80, 0x7d, 0x97, 0x3d, 0x3b, 0x61, 0xbe, 0x30, 0xbc,
	0xd0, 0x29, 0xe9, 0xd5, 0x58, 0xca, 0x83, 0x65, 0x07, 0xa6, 0x58, 0x8c, 0xb1, 0xe4, 0x20, 0x67,
	0x6a, 0x61, 0x9a, 0x9f, 0xef, 0x0f, 0x94, 0x2f, 0x45, 0x2b, 0x2c, 0xf4, 0x3a, 0x64, 0x5b, 0x40,
	0x9a, 0x1e, 0x0d, 0x2e, 0xf4, 0xaa, 0x9f, 0x96, 0xa1, 0x26, 0xd4, 0xa2, 0xd9, 0xa7, 0xc4, 0x30,
	0x71, 0xb8, 0x30, 0xc3, 0x89, 0xee, 0xab, 0x44, 0x12, 0xde, 0x21, 0xeb, 0x38, 0x14, 0x3c, 0x95,
	0x5e, 0x4a, 0xb4, 0xf4, 0x05, 0xa0, 0xac, 0x2f, 0x76, 0xee, 0x9e, 0xe0, 0x0b, 0x79, 0x28, 0xb1,
	0x3f, 0xd9, 0xf9, 0x7c, 0x6a, 0xba, 0x03, 0x1c, 0x55, 0xbc, 0xbc, 0xf1, 0xf9, 0xd8, 0xf3, 0xdc,
	0xd2, 0x8f, 0x60, 0x3a, 0xe3, 0xe4, 0x6d, 0x04, 0xa5, 0x14, 0x81, 0xd6, 0x81, 0x8a, 0x52, 0xdf,
	0x2d, 0xc3, 0xa4, 0x28, 0x52, 0xa3, 0xbd, 0x54, 0xd1, 0x4b, 0x42, 0xd0, 0xb2, 0xd9, 0xb3, 0x8c,
	0x54, 0x86, 0x3e, 0xb6, 0x9c, 0xae, 0x63, 0xc9, 0xe2, 0xb7, 0x26, 0xc4, 0x87, 0x52, 0xaa, 0xfd,
	0x67, 0x19, 0x6a, 0xea, 0xe7, 0xba, 0xcb, 0xab, 0xe8, 0x45, 0x28, 0x05, 0xe7, 0xc6, 0xd1, 0x05,
	0xc5, 0x21, 0x67, 0x2b, 0xe8, 0xc5, 0xe0, 0xfc, 0x25, 0x6b, 0xb2, 0x20, 0x0f, 0xce, 0x0d, 0x9f,
	0x97, 0xe1, 0xa1, 0xdc, 0x8c, 0x93, 0xc1, 0xb9, 0xa8, 0xcb, 0x43, 0x9e, 0x4a, 0xcf, 0x8d, 0x81,
	0x65, 0xb2, 0xa3, 0x48, 0x82, 0xf2, 0x1c, 0x54, 0x0b, 0xce, 0x5f, 0x31, 0xb1, 0x8a, 0xec, 0x2b,
	0xc8, 0x89, 0x08, 0xb9, 0x97, 0x45, 0x1e, 0x29, 0xc8, 0x42, 0x84, 0x7c, 0x99, 0x45, 0x8a, 0x77,
	0xc8, 0x11, 0xb2, 0x18, 0x21, 0xf9, 0x5b, 0xe0, 0x08, 0xb9, 0x0c, 0x93, 0xc1, 0xb9, 0xd1, 0x0d,
	0xcc, 0x3e, 0x0e, 0x79, 0x69, 0x5d, 0xd0, 0x4b, 0xc1, 0xf9, 0x16, 0x6f, 0xb3, 0x13, 0x2b, 0x56,
	0x1a, 0xcf, 0x9e, 0xca, 0x7c, 0x02, 0x91, 0xfe, 0xd9, 0x53, 0xf4, 0x11, 0x77, 0x14, 0x21, 0xd6,
	0x8c, 0xd5, 0xc6, 0x67, 0xbc, 0xdc, 0x2e, 0xe8, 0xd5, 0x18, 0xb5, 0xb6, 0xda, 0xf8, 0x0c, 0x7d,
	0x07, 0xa6, 0x13, 0xe0, 0x6a, 0xe3, 0xb9, 0xd1, 0x58, 0x5b, 0x5b, 0x98, 0x8d, 0xba, 0x24, 0x90,
	0xab, 0x8d, 0xe7, 0x8d, 0xb5, 0x35, 0x15, 0xda, 0x58, 0x7b, 0x66, 0xac, 0xad, 0xae, 0x2e, 0xcc,
	0xa9, 0xd0, 0xc6, 0xda, 0xb3, 0xb5, 0xd5, 0x55, 0xf4, 0x5d, 0x40, 0x09, 0x74, 0x6d, 0xb5, 0x61,
	0xac, 0x3e, 0x69, 0x7c, 0xba, 0x30, 0x2f, 0xd2, 0x5e, 0x84, 0x5d, 0x5b, 0x6d, 0x30, 0x31, 0xfa,
	0x04, 0x66, 0x52, 0x5d, 0x78, 0xd2, 0x78, 0x6a, 0xac, 0xae, 0xad, 0x3e, 0x5f, 0xb8, 0xcd, 0xd1,
	0xf5, 0xb8, 0x13, 0x4f, 0x1a, 0x4f, 0x99, 0x7c, 0x08, 0xbe, 0xb6, 0xfa, 0xc2, 0x68, 0x3c, 0x79,
	0xfa, 0xd9, 0xc2, 0xc2, 0x10, 0x7c, 0x6d, 0xf5, 0x05, 0x93, 0xab, 0xf0, 0xc6, 0x93, 0xa7, 0xcf,
	0x8d, 0xa7, 0x4f, 0x5e, 0xac, 0x2d, 0x2c, 0xaa, 0x70, 0xa6, 0x60, 0x72, 0x15, 0xfe, 0xf4, 0xc9,
	0x8b, 0x67, 0xc6, 0x8b, 0xc6, 0xea, 0xb3, 0x85, 0x25, 0x15, 0xce, 0x14, 0x4c, 0x8e, 0x1e, 0xc3,
	0x6c, 0x02, 0x7f, 0xd1, 0x58, 0xfd, 0xcc, 0x58, 0x7d, 0xf6, 0xe9, 0xf3, 0x4f, 0x17, 0x96, 0x39,
	0x7e, 0x3a, 0xc2, 0x33, 0x0d, 0x57, 0xb0, 0xe3, 0x3e, 0x38, 0x37, 0xac, 0xc0, 0x12, 0x51, 0x10,
	0xf2, 0xf4, 0x55, 0xd0, 0xcb, 0xc1, 0xf9, 0x46, 0x60, 0xf1, 0x08, 0xe0, 0xa5, 0x1d, 0x8d, 0xa2,
	0xbb, 0x24, 0xa2, 0x9b, 0x26, 0xd1, 0x4d, 0x93, 0xe8, 0x9e, 0x14, 0xd1, 0x4d, 0xd3, 0xd1, 0x4d,
	0x87, 0xa3, 0x1b, 0xc4, 0x0a, 0xd1, 0x4c, 0x74, 0xd3, 0xe1, 0xe8, 0x2e, 0x47, 0xc8, 0xbd, 0x2c,
	0x52, 0x8d, 0xee, 0x4a, 0x84, 0x7c, 0x99, 0x45, 0xaa, 0xd1, 0x5d, 0x8d, 0x90, 0xc3, 0xd1, 0x4d,
	0xe3, 0xe8, 0xbe, 0x23, 0xa2, 0x9b, 0xa6, 0xa2, 0x9b, 0xa6, 0xa3, 0xfb, 0xae, 0x88, 0x6e, 0xaa,
	0x44, 0x37, 0x1d, 0x8e, 0xee, 0x7b, 0x22, 0xba, 0xe9, 0x70, 0x74, 0xd3, 0x4c, 0x74, 0xdf, 0x8f,
	0xba, 0x34, 0x1c, 0xdd, 0x34, 0x13, 0xdd, 0x0f, 0x54, 0x68, 0x12, 0xdd, 0x34, 0x1b, 0xdd, 0x0f,
	0x45, 0x74, 0xd3, 0x6c, 0x74, 0xd3, 0x11, 0xd1, 0xad, 0x89, 0x80, 0xa2, 0x23, 0xa2, 0x9b, 0x8e,
	0x88, 0xee, 0xf7, 0x86, 0xe0, 0xa9, 0xe8, 0xa6, 0x23, 0xa2, 0xfb, 0x7d, 0x15, 0x9e, 0x8e, 0x6e,
	0x3a, 0x22, 0xba, 0x3f, 0x50, 0xe1, 0xe9, 0xe8, 0xa6, 0xa3, 0xa2, 0xfb, 0x43, 0x11, 0xdd, 0x34,
	0x13, 0xdd, 0x77, 0x01, 0x8e, 0x1c, 0x3f, 0x0a, 0xed, 0x29, 0x11, 0x9e, 0x47, 0x8e, 0x2f, 0x03,
	0xfb, 0x0e, 0x4c, 0x52, 0xa7, 0x8f, 0x43, 0x6a, 0xf6, 0x7d, 0x7e, 0xdc, 0x16, 0xf5, 0x44, 0xa0,
	0xfd, 0x73, 0x91, 0x7f, 0x42, 0x79, 0x97, 0xfc, 0x7f, 0xc9, 0xfb, 0x9c, 0x0f, 0xa0, 0xe6, 0x93,
	0xd0, 0xa1, 0xce, 0x29, 0x16, 0x9f, 0xf5, 0x65, 0xfe, 0xaf, 0x46, 0x52, 0xfe, 0x99, 0x9e, 0xc1,
	0x3c, 0xdc, 0x33, 0x53, 0x30, 0x71, 0x02, 0x54, 0x23, 0xa9, 0x80, 0x3d, 0x87, 0x05, 0x1b, 0xbb,
	0x4e, 0xdf, 0x61, 0x55, 0x71, 0xdf, 0x09, 0x43, 0xc3, 0xc6, 0x14, 0x5b, 0xf1, 0xeb, 0xb8, 0x82,
	0x3e, 0x1f, 0xeb, 0xf7, 0x9c, 0x30, 0xdc, 0x8c, 0xb4, 0x43, 0xd3, 0x50, 0x18, 0x9e, 0x86, 0x65,
	0x60, 0x0d, 0x63, 0xe0, 0x39, 0x71, 0xfa, 0x2f, 0x1d, 0x39, 0xfe, 0x2b, 0xd6, 0x46, 0x0d, 0x98,
	0xeb, 0x62, 0xcb, 0xb0, 0x48, 0x10, 0xf0, 0x57, 0x21, 0x46, 0x78, 0xd1, 0x3f, 0x22, 0x6e, 0x94,
	0x09, 0x66, 0xba, 0xd8, 0xda, 0x88, 0x74, 0x87, 0x42, 0x85, 0x9e, 0xc1, 0x6d, 0x61, 0x63, 0xe3,
	0x33, 0x12, 0xd8, 0x61, 0x62, 0x2d, 0x53, 0xc4, 0x1c, 0xb7, 0x92, 0xda, 0xd8, 0x1c, 0xfd, 0x10,
	0x96, 0x55, 0xbb, 0x81, 0x27, 0x2d, 0xcd, 0x23, 0x17, 0xcb, 0xcc, 0xb1, 0x98, 0xb6, 0x7d, 0x95,
	0x06, 0xa0, 0xf7, 0xa0, 0xaa, 0xd8, 0xcb, 0x0c, 0x52, 0x49, 0x5b, 0xb0, 0x47, 0x0c, 0x75, 0x40,
	0x62, 0xdc, 0x22, 0x85, 0x4c, 0xa7, 0x87, 0x23, 0x26, 0xe0, 0x43, 0x98, 0x3a, 0xef, 0xe1, 0xbe,
	0x71, 0x82, 0x2f, 0xa2, 0x19, 0x14, 0x49, 0xa4, 0xca, 0xc4, 0x5f, 0xe1, 0x8b, 0x64, 0x16, 0x39,
	0xce, 0x25, 0x61, 0x94, 0x45, 0x4b, 0x4c, 0xb0, 0x4b, 0x42, 0x4e, 0xc2, 0xaa, 0x00, 0x97, 0x98,
	0xfd, 0x50, 0xb0, 0xc8, 0x68, 0xac, 0x06, 0xe7, 0x07, 0x5c, 0xca, 0x59, 0xe4, 0x41, 0x25, 0x71,
	0x1e, 0xf1, 0x0c, 0xc7, 0x76, 0x31, 0x0f, 0x4d, 0x7e, 0x50, 0x09, 0xe8, 0x3e, 0xf1, 0x5a, 0xb6,
	0xcb, 0xcb, 0xd1, 0xe0, 0x9c, 0xdf, 0xe6, 0x90, 0x27, 0x72, 0x21, 0x38, 0x6f, 0xf7, 0x2d, 0x07,
	0x3d, 0x87, 0x45, 0xa9, 0x88, 0xf2, 0x5e, 0x92, 0xe1, 0xe5, 0xe1, 0x3c, 0x27, 0xa0, 0x32, 0x01,
	0x46, 0xb9, 0x5e, 0x29, 0x64, 0x66, 0xae, 0x2a, 0x64, 0x66, 0x87, 0x0b, 0x99, 0xf4, 0x21, 0x31,
	0x77, 0xd5, 0x21, 0x31, 0x3f, 0x7c, 0x48, 0x3c, 0x84, 0xca, 0x11, 0x0e, 0x8c, 0x00, 0xb3, 0x12,
	0x10, 0xdb, 0xf2, 0xa0, 0x2d, 0x1f, 0xe1, 0x40, 0x97, 0x22, 0x74, 0x1f, 0xca, 0xae, 0x65, 0xf7,
	0xa2, 0xf9, 0x17, 0x67, 0x2b, 0x30, 0x91, 0x9c, 0x7c, 0xd6, 0x39, 0xdb, 0x89, 0xf4, 0x8b, 0xb2,
	0x73, 0xb6, 0x33, 0x6a, 0xa3, 0x2f, 0x0d, 0x6f, 0xf4, 0x7f, 0xcc, 0xf1, 0x0a, 0xf4, 0x5d, 0x8b,
	0xbd, 0xb7, 0x7c, 0x72, 0x78, 0x4b, 0xc1, 0x97, 0x9e, 0xe1, 0x7c, 0x66, 0x86, 0x53, 0xf3, 0x34,
	0x31, 0x3c, 0x4f, 0xe9, 0x19, 0x2e, 0xa8, 0x33, 0x7c, 0xf5, 0xf8, 0xfe, 0x3a, 0x07, 0x35, 0xf5,
	0xfa, 0x58, 0xfa, 0xf9, 0x30, 0xa7, 0x7c, 0x17, 0xf9, 0xf6, 0x95, 0xec, 0xb7, 0xaf, 0x12, 0xae,
	0x4e, 0xc3, 0x5f, 0x40, 0x55, 0xb9, 0x6f, 0x76, 0xf9, 0xc2, 0xcc, 0x43, 0x21, 0xa4, 0x26, 0x1d,
	0x84, 0xf2, 0x6d, 0xa8, 0x6c, 0x69, 0x5f, 0xc3, 0xcc, 0x88, 0x7b, 0x67, 0xd7, 0xce, 0xe6, 0x09,
	0xfd, 0xb8, 0x42, 0xff, 0xab, 0x31, 0xfe, 0xd1, 0x63, 0xf8, 0xfe, 0xdc, 0xb7, 0xf8, 0xde, 0xee,
	0x92, 0xd0, 0x50, 0x5c, 0x4c, 0xba, 0x24, 0x3c, 0xe4, 0x02, 0xa1, 0x3e, 0x8a, 0xd4, 0xf9, 0x48,
	0x7d, 0x24, 0xd5, 0x8f, 0xa0, 0xee, 0x12, 0xdf, 0x12, 0xe7, 0x82, 0x04, 0x89, 0x4f, 0x6e, 0x35,
	0x26, 0x67, 0xe7, 0x81, 0x44, 0xae, 0xc2, 0x9c, 0x44, 0xca, 0x8c, 0x10, 0xc1, 0x0b, 0xe2, 0x85,
	0xb9, 0x80, 0x8b, 0x7c, 0x20, 0x4d, 0xd8, 0xf6, 0x23, 0x5d, 0x27, 0x02, 0x16, 0xc5, 0xeb, 0x30,
	0x26, 0x92, 0x80, 0x87, 0x50, 0x61, 0x99, 0x29, 0x46, 0x94, 0x38, 0xa2, 0xcc, 0x65, 0x02, 0xa2,
	0x61, 0x58, 0xbe, 0xe2, 0xb6, 0xdd, 0x8d, 0x2d, 0xc6, 0x1f, 0xe7, 0x60, 0xe9, 0xf2, 0xab, 0x77,
	0x37, 0xe5, 0x06, 0x7d, 0x0a, 0xf3, 0x8e, 0x77, 0x8a, 0x83, 0x10, 0x1b, 0xec, 0x69, 0x5c, 0xcc,
	0x63, 0x60, 0xd2, 0xe8, 0x43, 0xd3, 0x8c, 0xd4, 0xbe, 0x74, 0xc4, 0x65, 0x1a, 0xdd, 0xa4, 0x58,
	0xfb, 0xa5, 0xe8, 0xdb, 0x25, 0x37, 0xf7, 0x6e, 0xac, 0x6f, 0xb3, 0x30, 0x91, 0x54, 0x11, 0x45,
	0x5d, 0x34, 0x18, 0xbb, 0x87, 0xcf, 0x0c, 0xfc, 0x4d, 0xf4, 0xd6, 0xaa, 0xe0, 0xe1, 0xb3, 0xe6,
	0x37, 0xb6, 0x76, 0x0c, 0xf7, 0xae, 0xbe, 0xf7, 0x77, 0x63, 0x6b, 0xf3, 0x27, 0x39, 0x11, 0x03,
	0x97, 0xdc, 0x04, 0xfc, 0xff, 0x5d, 0x9c, 0x9f, 0xe7, 0x40, 0x7b, 0xfb, 0xad, 0xc2, 0xff, 0xdd,
	0x45, 0xd2, 0xbe, 0xe1, 0x6b, 0x71, 0xc5, 0xed, 0xc3, 0x6b, 0xfb, 0xbf, 0xaf, 0xde, 0xa4, 0x11,
	0xaf, 0x37, 0xd3, 0x97, 0x63, 0x4e, 0xe0, 0xe1, 0x5b, 0xaf, 0x0a, 0xde, 0x58, 0x04, 0x74, 0x00,
	0xe9, 0xf2, 0x50, 0x4e, 0xb1, 0xb3, 0xe2, 0x28, 0x3a, 0xbc, 0x0d, 0x8b, 0x0c, 0x3c, 0xca, 0xbd,
	0xb0, 0xe2, 0x48, 0x82, 0x37, 0x98, 0xf0, 0xd2, 0xfc, 0xfe, 0x47, 0x39, 0x58, 0xb8, 0xec, 0x2e,
	0xe2, 0xb5, 0xbb, 0xbe, 0x0e, 0xd5, 0xa4, 0x33, 0xa3, 0x6e, 0x1f, 0x67, 0x07, 0xb0, 0x73, 0x4b,
	0x2f, 0x07, 0x89, 0xf4, 0x65, 0x91, 0x7f, 0x8a, 0xa2, 0xa1, 0xb6, 0x0f, 0x77, 0xae, 0xba, 0xe9,
	0x79, 0xdd, 0xbe, 0x69, 0x3f, 0x83, 0x07, 0x6f, 0xbb, 0x15, 0x79, 0x63, 0x4b, 0xf5, 0x33, 0x58,
	0xbc, 0xf4, 0x6a, 0xe4, 0xb7, 0x39, 0xdb, 0x52, 0xe5, 0xd9, 0xf8, 0x50, 0x79, 0xa6, 0xfd, 0x59,
	0x0e, 0x1e, 0xbd, 0xeb, 0x3d, 0xc9, 0x1b, 0xdb, 0x81, 0x9f, 0x00, 0x4a, 0xdf, 0xdd, 0x94, 0x7d,
	0x13, 0xdb, 0x71, 0x3a, 0xa5, 0x91, 0x7d, 0xec, 0xc3, 0x7b, 0xef, 0x70, 0xa3, 0xf2, 0xc6, 0xa6,
	0xdf, 0xe5, 0xd9, 0xe8, 0x2d, 0xb7, 0x2a, 0x6f, 0xcc, 0xdb, 0xef, 0xe7, 0xe0, 0xc3, 0x77, 0xbb,
	0x5f, 0x79, 0x63, 0xd3, 0xbf, 0x04, 0xa5, 0xa1, 0xcb, 0x19, 0x71, 0x5b, 0xfb, 0xf7, 0x1c, 0x94,
	0xb7, 0x03, 0x32, 0xf0, 0xf7, 0x30, 0x7f, 0xa1, 0xfb, 0x10, 0x2a, 0x4e, 0x74, 0xd3, 0x26, 0x72,
	0x5c, 0xe5, 0xbf, 0x2a, 0x11, 0xb2, 0x96, 0x8d, 0x5a, 0x50, 0x4b, 0x20, 0xfc, 0x83, 0x85, 0xf8,
	0xb4, 0x9c, 0x5c, 0xf4, 0x4d, 0x11, 0xae, 0xc4, 0xf7, 0x76, 0xf8, 0x37, 0xe4, 0xaa, 0x93, 0x6e,
	0xa2, 0x7b, 0x50, 0x66, 0xcf, 0x71, 0x51, 0x81, 0x3f, 0xce, 0x9d, 0xb1, 0x02, 0xff, 0x40, 0x14,
	0xf8, 0xe9, 0x2f, 0x07, 0x79, 0xae, 0x8c, 0xdb, 0xda, 0xaf, 0x41, 0x55, 0xe1, 0x46, 0x45, 0x18,
	0x3f, 0x68, 0xef, 0xd7, 0x6f, 0xa1, 0x3a, 0x54, 0x9a, 0x07, 0xed, 0x7d, 0x63, 0x75, 0xdb, 0x38,
	0x58, 0xef, 0xec, 0xd4, 0x73, 0x68, 0x1a, 0xaa, 0x42, 0xf2, 0x44, 0x8a, 0xc6, 0xb4, 0xdf, 0x1d,
	0x83, 0x09, 0xde, 0x4f, 0xe5, 0x8b, 0x82, 0x18, 0x6e, 0xfc, 0x45, 0xe1, 0x07, 0x50, 0xb4, 0x48,
	0xbf, 0x6f, 0xca, 0x9f, 0x57, 0x64, 0xc6, 0x98, 0x1e, 0x69, 0xb8, 0x21, 0x90, 0x7a, 0x64, 0x82,
	0x56, 0xa0, 0xd8, 0x17, 0x2a, 0x79, 0x31, 0x60, 0x76, 0xd4, 0x0c, 0xe9, 0x11, 0x28, 0xf5, 0x41,
	0x25, 0x7f, 0xe5, 0x07, 0x15, 0xed, 0x2b, 0x98, 0x19, 0xe1, 0x18, 0x4d, 0x41, 0x79, 0x7d, 0x73,
	0xd3, 0xd8, 0x6b, 0xee, 0xbd, 0x6c, 0xea, 0x87, 0xf5, 0x5b, 0x08, 0x41, 0x4d, 0x6f, 0xee, 0xb5,
	0x5f, 0x37, 0x63, 0x59, 0x8e, 0x81, 0x0e, 0x9b, 0x9d, 0x58, 0x30, 0xa6, 0x7d, 0x0d, 0xf0, 0xda,
	0x74, 0x07, 0xf8, 0xc0, 0x0c, 0xcc, 0x3e, 0xba, 0x07, 0xe3, 0xc4, 0x1b, 0xc8, 0x4f, 0x7b, 0x15,
	0xe5, 0xea, 0x36, 0x53, 0xa0, 0xc7, 0xe9, 0x4f, 0x03, 0xb5, 0xc6, 0xe2, 0x4a, 0xfc, 0x7b, 0xa9,
	0x15, 0xce, 0xc2, 0x56, 0x62, 0x85, 0x2f, 0xb5, 0xc0, 0x69, 0x7f, 0x3b, 0x06, 0xb5, 0x03, 0xe2,
	0xe9, 0xe7, 0x07, 0xe4, 0x0c, 0x07, 0x9b, 0x26, 0x35, 0x6f, 0x2c, 0xae, 0x75, 0xf5, 0xc0, 0xcd,
	0xf3, 0x1e, 0xad, 0xa6, 0x7e, 0x00, 0x94, 0xf6, 0xba, 0xa2, 0x87, 0xa1, 0xb3, 0x87, 0xcd, 0x70,
	0x10, 0xf0, 0xad, 0x3d, 0xfa, 0x02, 0xab, 0x7c, 0xd3, 0xed, 0x33, 0x2b, 0xa3, 0x8f, 0x4d, 0xcf,
	0xb0, 0x8f, 0xfa, 0xbc, 0x8a, 0xcb, 0xe9, 0xb5, 0x40, 0xb0, 0xed, 0x61, 0xd3, 0xdb, 0x3c, 0xea,
	0xb3, 0xb4, 0x7d, 0x29, 0x27, 0x9a, 0x85, 0xfa, 0x88, 0x0b, 0xae, 0x77, 0x60, 0x41, 0x95, 0x1a,
	0x9b, 0xcd, 0xdd, 0xd6, 0x5e, 0xab, 0xd3, 0xd4, 0xeb, 0x39, 0xb4, 0x08, 0x73, 0x43, 0xda, 0xf5,
	0x8d, 0x8d, 0xe6, 0x21, 0x5b, 0xa4, 0x7f, 0xcd, 0xf1, 0x17, 0x64, 0xed, 0xa3, 0x9f, 0x61, 0x8b,
	0xf2, 0x49, 0x4c, 0xe6, 0x2a, 0x97, 0x9e, 0xab, 0xe7, 0xe2, 0x40, 0xcc, 0xee, 0x49, 0xc5, 0x5a,
	0xb6, 0xf8, 0x35, 0x52, 0x5d, 0x18, 0xa0, 0x8f, 0x20, 0xef, 0x92, 0xd0, 0xe1, 0x73, 0x5c, 0x4b,
	0x7d, 0xfd, 0xe3, 0x0f, 0x5b, 0x02, 0xc9, 0x01, 0x02, 0xd8, 0x75, 0xe4, 0x7c, 0x5f, 0x06, 0xec,
	0x3a, 0xda, 0xf7, 0xa1, 0x9c, 0xf2, 0xc3, 0xa2, 0x71, 0xbf, 0xdd, 0x31, 0x36, 0xda, 0xfb, 0x5b,
	0xad, 0xed, 0x57, 0x7a, 0x73, 0xb3, 0x7e, 0x0b, 0x01, 0x14, 0xf8, 0x35, 0xda, 0x66, 0x3d, 0x87,
	0x2a, 0x50, 0x6a, 0xed, 0xcb, 0xd6, 0x98, 0x76, 0x20, 0x6e, 0x82, 0xa7, 0x46, 0x7c, 0x69, 0xd8,
	0x7c, 0x00, 0xe3, 0x2e, 0x09, 0xe5, 0x88, 0x47, 0xf6, 0x87, 0xe9, 0xb5, 0x5f, 0xe5, 0x00, 0x25,
	0x74, 0x3a, 0x0e, 0x7d, 0xe2, 0x85, 0x18, 0x7d, 0x01, 0x53, 0x6c, 0x22, 0x09, 0xd7, 0x18, 0xb6,
	0x49, 0x4d, 0x79, 0xf9, 0x7b, 0x7e, 0xf4, 0xdc, 0xed, 0xdc, 0xd2, 0xab, 0x44, 0x59, 0x8a, 0x0d,
	0xa8, 0x8b, 0x5f, 0xea, 0xa5, 0x28, 0xc6, 0x47, 0xfc, 0xce, 0x4f, 0xe1, 0xa8, 0x39, 0x8a, 0x24,
	0xbe, 0x31, 0xff, 0x07, 0x39, 0x98, 0x4e, 0xf7, 0xf2, 0x9b, 0x01, 0x0e, 0x29, 0x7a, 0x96, 0xed,
	0xe4, 0x88, 0x2d, 0x9a, 0xed, 0xda, 0x0f, 0x60, 0xca, 0xf1, 0xe8, 0x88, 0xc1, 0xa1, 0x74, 0xcf,
	0x44, 0x12, 0x65, 0xd6, 0x8e, 0x47, 0x47, 0xf4, 0xa9, 0x08, 0x13, 0xcd, 0xbe, 0x4f, 0x2f, 0x3e,
	0xbe, 0x0b, 0x90, 0xcc, 0x2a, 0x4b, 0xb8, 0xed, 0xad, 0xad, 0xfa, 0x2d, 0x54, 0x80, 0xb1, 0xf6,
	0x7e, 0x3d, 0xd7, 0xf8, 0xaf, 0x59, 0x28, 0xb6, 0x05, 0x2d, 0xda, 0x04, 0xd8, 0x74, 0x42, 0xf3,
	0xc8, 0xc5, 0x6d, 0x97, 0xa2, 0x5a, 0xec, 0x8e, 0x13, 0x2d, 0x0d, 0xb5, 0xb5, 0xf9, 0x9f, 0xff,
	0xc3, 0x3f, 0xfd, 0x72, 0xac, 0xae, 0x95, 0x1f, 0x9f, 0xae, 0x3e, 0x96, 0x76, 0x9f, 0xe7, 0x3e,
	0x46, 0x5b, 0x50, 0xd6, 0x31, 0xf6, 0xde, 0x95, 0xe6, 0x36, 0xa7, 0x99, 0xd6, 0x2a, 0x8c, 0x26,
	0x32, 0x64, 0x3c, 0x4d, 0x28, 0xcb, 0x52, 0x1f, 0xb7, 0xbd, 0x01, 0x52, 0x66, 0x2d, 0xc3, 0xb2,
	0xc0, 0x59, 0x90, 0x56, 0x65, 0x2c, 0x4d, 0xe1, 0xdc, 0x1b, 0x30, 0x9a, 0x1d, 0xa8, 0xc6, 0x25,
	0xe1, 0x3b, 0x10, 0x2d, 0x72, 0xa2, 0x19, 0xad, 0x96, 0x1a, 0x95, 0x64, 0xda, 0x80, 0xc9, 0x4d,
	0xec, 0xe2, 0x6b, 0x77, 0x27, 0x36, 0x62, 0x24, 0x2d, 0x00, 0x79, 0x9f, 0xb2, 0x3d, 0xa0, 0xa8,
	0xae, 0xfc, 0xd0, 0x72, 0x2f, 0xec, 0x5d, 0xdd, 0x9f, 0xc4, 0x92, 0x51, 0xb5, 0xa1, 0x12, 0x5f,
	0xa6, 0x64, 0x64, 0x48, 0xf9, 0x71, 0x0b, 0x17, 0x67, 0xe8, 0x96, 0x39, 0xdd, 0x9c, 0x56, 0xe7,
	0x74, 0x29, 0x6b, 0x46, 0xf8, 0x1b, 0x30, 0x95, 0xbe, 0x16, 0xc9, 0x38, 0x93, 0x2b, 0xb1, 0x69,
	0x4d, 0x86, 0xf6, 0x1e, 0xa7, 0x5d, 0xd0, 0x66, 0x18, 0xed, 0x10, 0x07, 0x63, 0xfe, 0x02, 0x8a,
	0x5b, 0x2e, 0x39, 0x5b, 0xb7, 0x6d, 0x54, 0x55, 0x3e, 0xa0, 0x5f, 0x1d, 0x55, 0xd2, 0x46, 0x44,
	0x15, 0xb0, 0x96, 0xce, 0x2f, 0xd0, 0xbc, 0x8d, 0x44, 0x99, 0xb4, 0xc4, 0x8c, 0xf1, 0x1c, 0x42,
	0x2d, 0xbe, 0x70, 0xbc, 0x71, 0x8c, 0xad, 0x93, 0x4c, 0x80, 0x26, 0xd3, 0x18, 0x03, 0xb5, 0xbb,
	0x9c, 0xf0, 0xb6, 0x86, 0x18, 0xa1, 0x6a, 0xcf, 0x48, 0xf7, 0xa0, 0x2c, 0x62, 0xee, 0x80, 0x78,
	0xad, 0x2e, 0x1a, 0xb1, 0x51, 0x33, 0x5d, 0x5c, 0xe2, 0x8c, 0xb3, 0xda, 0x54, 0x12, 0xb0, 0xdc,
	0x58, 0x2e, 0xac, 0x8c, 0xbc, 0x77, 0xe7, 0x53, 0x16, 0x36, 0x6d, 0xcd, 0x08, 0x75, 0xa8, 0x6e,
	0x63, 0x9a, 0xba, 0xb6, 0x3a, 0x3c, 0xe6, 0x99, 0x11, 0x57, 0x0c, 0xb5, 0x3b, 0x9c, 0x72, 0x5e,
	0x9b, 0x66, 0x94, 0x8a, 0x3d, 0xe3, 0xfc, 0x11, 0x14, 0x74, 0x7c, 0x44, 0xc8, 0xdb, 0x77, 0xf8,
	0x1c, 0xe7, 0x99, 0xd2, 0x40, 0xec, 0x70, 0x66, 0xc3, 0x08, 0x5e, 0xc1, 0xf4, 0x06, 0x71, 0x5d,
	0x6c, 0xa5, 0x5f, 0x2b, 0xbf, 0x8d, 0xeb, 0x01, 0xe7, 0x5a, 0xd2, 0xe6, 0x18, 0x57, 0xc6, 0x9c,
	0xd1, 0xfe, 0x18, 0xea, 0xdb, 0x98, 0xaa, 0x5f, 0xa6, 0xd4, 0xcd, 0x3a, 0x3f, 0xf4, 0x03, 0x57,
	0x89, 0xd2, 0xee, 0x73, 0xee, 0x45, 0x6d, 0x56, 0x8e, 0x57, 0xd1, 0x32, 0xea, 0x13, 0x98, 0xdd,
	0xc6, 0x34, 0xfb, 0x2e, 0x7c, 0xd4, 0xc6, 0x4b, 0x7e, 0xb1, 0x9d, 0xc1, 0x6b, 0xef, 0x71, 0x47,
	0x77, 0xb5, 0x05, 0xe9, 0x28, 0x83, 0x60, 0xce, 0x02, 0xb8, 0xbd, 0x11, 0x60, 0x93, 0xe2, 0x4e,
	0x60, 0x76, 0xbb, 0x8e, 0x75, 0x68, 0x1d, 0x63, 0x7b, 0xe0, 0xb2, 0xa2, 0xf3, 0xfe, 0x8a, 0xf2,
	0x9b, 0xf9, 0x0c, 0x20, 0x33, 0x6b, 0x1f, 0x72, 0x87, 0x0f, 0xb4, 0x65, 0x3e, 0x6b, 0xa3, 0x59,
	0xa5, 0x4f, 0xb1, 0x53, 0x6e, 0xda, 0xe7, 0x25, 0xac, 0xcc, 0x67, 0x17, 0x66, 0x94, 0x1e, 0xfd,
	0xfa, 0x00, 0x0f, 0x70, 0x88, 0x96, 0x47, 0xfa, 0x13, 0xca, 0x8c, 0x2f, 0x8d, 0xfb, 0xba, 0xa3,
	0xdd, 0xce, 0x8c, 0x4f, 0x18, 0x48, 0x3f, 0x4a, 0x2f, 0xfe, 0xc7, 0x7e, 0x46, 0xb0, 0x31, 0x3f,
	0xdf, 0x87, 0xba, 0xd8, 0xce, 0xa9, 0xa7, 0xc2, 0xcb, 0xb7, 0x5b, 0x02, 0xd2, 0x6e, 0x3d, 0xc9,
	0xa1, 0xaf, 0x61, 0xee, 0x00, 0x07, 0x5d, 0x12, 0xf4, 0xf9, 0xc3, 0x42, 0xdb, 0xc7, 0xc1, 0x30,
	0x03, 0x57, 0x64, 0x7a, 0xf6, 0x3e, 0xef, 0xd9, 0x3d, 0x6d, 0x91, 0xf5, 0x6c, 0x24, 0x85, 0x38,
	0x7c, 0xca, 0xe2, 0x30, 0x12, 0x4f, 0x51, 0x6f, 0x23, 0x55, 0x72, 0x54, 0xca, 0x90, 0x51, 0xbd,
	0x81, 0xf2, 0x36, 0xa6, 0xcd, 0x73, 0xca, 0x1f, 0x21, 0x50, 0x32, 0xa2, 0xe4, 0xc1, 0x64, 0xe9,
	0x76, 0xea, 0x49, 0x43, 0xc7, 0x74, 0x10, 0x78, 0x5c, 0x19, 0xaa, 0xc4, 0x29, 0x1a, 0x46, 0xfc,
	0x35, 0xff, 0x11, 0xa0, 0x78, 0x5b, 0x25, 0x0a, 0x17, 0x4c, 0xd1, 0xfc, 0x8a, 0xfc, 0xff, 0x1f,
	0x54, 0xd5, 0xd5, 0xe9, 0x21, 0x43, 0xc3, 0xe8, 0x7d, 0x58, 0xdc, 0xc6, 0x74, 0x77, 0xf4, 0xcf,
	0x23, 0xd4, 0x3c, 0xb1, 0xac, 0xfe, 0x82, 0x53, 0xf9, 0xd1, 0x86, 0xf6, 0x88, 0x7b, 0xd2, 0xb4,
	0xbb, 0x72, 0x08, 0xa3, 0x19, 0x99, 0xc7, 0x63, 0x98, 0x1b, 0xa9, 0xbf, 0x8e, 0x37, 0x65, 0x79,
	0x47, 0xb2, 0x31, 0x4f, 0x1d, 0x9e, 0xe6, 0x93, 0x67, 0xa8, 0x21, 0x0f, 0xb7, 0x2f, 0x79, 0xcc,
	0xca, 0x24, 0xfa, 0x44, 0xcd, 0x58, 0x7f, 0x13, 0x26, 0x59, 0x32, 0xe4, 0x25, 0x26, 0x4a, 0xfd,
	0x47, 0x14, 0xc3, 0x05, 0x6f, 0x7a, 0x04, 0x99, 0x92, 0x5d, 0xad, 0x88, 0x62, 0xbe, 0xcf, 0x73,
	0x1f, 0xbf, 0xfc, 0x1a, 0x96, 0x49, 0xd0, 0xe3, 0xb6, 0x16, 0x09, 0xec, 0x15, 0xf1, 0x7f, 0x7b,
	0x44, 0x5c, 0x2f, 0xab, 0xaf, 0x79, 0x9b, 0xd5, 0xa8, 0xed, 0xdd, 0xce, 0x4f, 0x1e, 0xf7, 0x1c,
	0x7a, 0x3c, 0x38, 0x5a, 0xb1, 0x48, 0xff, 0x71, 0x64, 0xf2, 0x58, 0x98, 0x7c, 0x22, 0xff, 0x3b,
	0x90, 0xd3, 0xb5, 0xc7, 0x3d, 0x12, 0xfd, 0xd7, 0x24, 0x47, 0x05, 0x2e, 0xfd, 0xf4, 0xbf, 0x03,
	0x00, 0x00, 0xff, 0xff, 0x56, 0xca, 0x93, 0x77, 0xba, 0x44, 0x00, 0x00,
}

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

// 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.SupportPackageIsVersion4

// OpenoltClient is the client API for Openolt service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type OpenoltClient interface {
	DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error)
	OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error)
	OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error)
	UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error)
	FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error)
	HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error)
	EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error)
	GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error)
	Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error)
	GetOnuStatistics(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuStatistics, error)
	GetGemPortStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*GemPortStatistics, error)
	CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error)
	CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error)
	EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error)
	PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
	DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error)
	GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*extension.ReturnValues, error)
	OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error)
	GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
	GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error)
	GetPonRxPower(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*PonRxPowerData, error)
	//
	// GetObjects gets takes in type of the object and request details as argument.
	// Returns the Object from the device.
	GetObject(ctx context.Context, in *ObjectDataRequest, opts ...grpc.CallOption) (*ObjectDataResponse, error)
}

type openoltClient struct {
	cc *grpc.ClientConn
}

func NewOpenoltClient(cc *grpc.ClientConn) OpenoltClient {
	return &openoltClient{cc}
}

func (c *openoltClient) DisableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ReenableOlt(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ReenableOlt", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) ActivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/ActivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeactivateOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeactivateOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeleteOnu(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteOnu", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OmciMsgOut(ctx context.Context, in *OmciMsg, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OmciMsgOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OnuPacketOut(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) UplinkPacketOut(ctx context.Context, in *UplinkPacket, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/UplinkPacketOut", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowAdd(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowAdd", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) FlowRemove(ctx context.Context, in *Flow, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/FlowRemove", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) HeartbeatCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Heartbeat, error) {
	out := new(Heartbeat)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/HeartbeatCheck", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/EnablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DisablePonIf(ctx context.Context, in *Interface, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DisablePonIf", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetDeviceInfo(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DeviceInfo, error) {
	out := new(DeviceInfo)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetDeviceInfo", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) Reboot(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/Reboot", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CollectStatistics(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CollectStatistics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetOnuStatistics(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuStatistics, error) {
	out := new(OnuStatistics)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetOnuStatistics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetGemPortStatistics(ctx context.Context, in *OnuPacket, opts ...grpc.CallOption) (*GemPortStatistics, error) {
	out := new(GemPortStatistics)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetGemPortStatistics", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficSchedulers(ctx context.Context, in *tech_profile.TrafficSchedulers, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficSchedulers", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) CreateTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/CreateTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) RemoveTrafficQueues(ctx context.Context, in *tech_profile.TrafficQueues, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/RemoveTrafficQueues", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) EnableIndication(ctx context.Context, in *Empty, opts ...grpc.CallOption) (Openolt_EnableIndicationClient, error) {
	stream, err := c.cc.NewStream(ctx, &_Openolt_serviceDesc.Streams[0], "/openolt.Openolt/EnableIndication", opts...)
	if err != nil {
		return nil, err
	}
	x := &openoltEnableIndicationClient{stream}
	if err := x.ClientStream.SendMsg(in); err != nil {
		return nil, err
	}
	if err := x.ClientStream.CloseSend(); err != nil {
		return nil, err
	}
	return x, nil
}

type Openolt_EnableIndicationClient interface {
	Recv() (*Indication, error)
	grpc.ClientStream
}

type openoltEnableIndicationClient struct {
	grpc.ClientStream
}

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

func (c *openoltClient) PerformGroupOperation(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/PerformGroupOperation", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) DeleteGroup(ctx context.Context, in *Group, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/DeleteGroup", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetExtValue(ctx context.Context, in *ValueParam, opts ...grpc.CallOption) (*extension.ReturnValues, error) {
	out := new(extension.ReturnValues)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetExtValue", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) OnuItuPonAlarmSet(ctx context.Context, in *config.OnuItuPonAlarm, opts ...grpc.CallOption) (*Empty, error) {
	out := new(Empty)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/OnuItuPonAlarmSet", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetLogicalOnuDistanceZero(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
	out := new(OnuLogicalDistance)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistanceZero", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetLogicalOnuDistance(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*OnuLogicalDistance, error) {
	out := new(OnuLogicalDistance)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetLogicalOnuDistance", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetPonRxPower(ctx context.Context, in *Onu, opts ...grpc.CallOption) (*PonRxPowerData, error) {
	out := new(PonRxPowerData)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetPonRxPower", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *openoltClient) GetObject(ctx context.Context, in *ObjectDataRequest, opts ...grpc.CallOption) (*ObjectDataResponse, error) {
	out := new(ObjectDataResponse)
	err := c.cc.Invoke(ctx, "/openolt.Openolt/GetObject", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// OpenoltServer is the server API for Openolt service.
type OpenoltServer interface {
	DisableOlt(context.Context, *Empty) (*Empty, error)
	ReenableOlt(context.Context, *Empty) (*Empty, error)
	ActivateOnu(context.Context, *Onu) (*Empty, error)
	DeactivateOnu(context.Context, *Onu) (*Empty, error)
	DeleteOnu(context.Context, *Onu) (*Empty, error)
	OmciMsgOut(context.Context, *OmciMsg) (*Empty, error)
	OnuPacketOut(context.Context, *OnuPacket) (*Empty, error)
	UplinkPacketOut(context.Context, *UplinkPacket) (*Empty, error)
	FlowAdd(context.Context, *Flow) (*Empty, error)
	FlowRemove(context.Context, *Flow) (*Empty, error)
	HeartbeatCheck(context.Context, *Empty) (*Heartbeat, error)
	EnablePonIf(context.Context, *Interface) (*Empty, error)
	DisablePonIf(context.Context, *Interface) (*Empty, error)
	GetDeviceInfo(context.Context, *Empty) (*DeviceInfo, error)
	Reboot(context.Context, *Empty) (*Empty, error)
	CollectStatistics(context.Context, *Empty) (*Empty, error)
	GetOnuStatistics(context.Context, *Onu) (*OnuStatistics, error)
	GetGemPortStatistics(context.Context, *OnuPacket) (*GemPortStatistics, error)
	CreateTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	RemoveTrafficSchedulers(context.Context, *tech_profile.TrafficSchedulers) (*Empty, error)
	CreateTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	RemoveTrafficQueues(context.Context, *tech_profile.TrafficQueues) (*Empty, error)
	EnableIndication(*Empty, Openolt_EnableIndicationServer) error
	PerformGroupOperation(context.Context, *Group) (*Empty, error)
	DeleteGroup(context.Context, *Group) (*Empty, error)
	GetExtValue(context.Context, *ValueParam) (*extension.ReturnValues, error)
	OnuItuPonAlarmSet(context.Context, *config.OnuItuPonAlarm) (*Empty, error)
	GetLogicalOnuDistanceZero(context.Context, *Onu) (*OnuLogicalDistance, error)
	GetLogicalOnuDistance(context.Context, *Onu) (*OnuLogicalDistance, error)
	GetPonRxPower(context.Context, *Onu) (*PonRxPowerData, error)
	//
	// GetObjects gets takes in type of the object and request details as argument.
	// Returns the Object from the device.
	GetObject(context.Context, *ObjectDataRequest) (*ObjectDataResponse, error)
}

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

func (*UnimplementedOpenoltServer) DisableOlt(ctx context.Context, req *Empty) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DisableOlt not implemented")
}
func (*UnimplementedOpenoltServer) ReenableOlt(ctx context.Context, req *Empty) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ReenableOlt not implemented")
}
func (*UnimplementedOpenoltServer) ActivateOnu(ctx context.Context, req *Onu) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method ActivateOnu not implemented")
}
func (*UnimplementedOpenoltServer) DeactivateOnu(ctx context.Context, req *Onu) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DeactivateOnu not implemented")
}
func (*UnimplementedOpenoltServer) DeleteOnu(ctx context.Context, req *Onu) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DeleteOnu not implemented")
}
func (*UnimplementedOpenoltServer) OmciMsgOut(ctx context.Context, req *OmciMsg) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OmciMsgOut not implemented")
}
func (*UnimplementedOpenoltServer) OnuPacketOut(ctx context.Context, req *OnuPacket) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OnuPacketOut not implemented")
}
func (*UnimplementedOpenoltServer) UplinkPacketOut(ctx context.Context, req *UplinkPacket) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method UplinkPacketOut not implemented")
}
func (*UnimplementedOpenoltServer) FlowAdd(ctx context.Context, req *Flow) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FlowAdd not implemented")
}
func (*UnimplementedOpenoltServer) FlowRemove(ctx context.Context, req *Flow) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method FlowRemove not implemented")
}
func (*UnimplementedOpenoltServer) HeartbeatCheck(ctx context.Context, req *Empty) (*Heartbeat, error) {
	return nil, status.Errorf(codes.Unimplemented, "method HeartbeatCheck not implemented")
}
func (*UnimplementedOpenoltServer) EnablePonIf(ctx context.Context, req *Interface) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method EnablePonIf not implemented")
}
func (*UnimplementedOpenoltServer) DisablePonIf(ctx context.Context, req *Interface) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DisablePonIf not implemented")
}
func (*UnimplementedOpenoltServer) GetDeviceInfo(ctx context.Context, req *Empty) (*DeviceInfo, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetDeviceInfo not implemented")
}
func (*UnimplementedOpenoltServer) Reboot(ctx context.Context, req *Empty) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method Reboot not implemented")
}
func (*UnimplementedOpenoltServer) CollectStatistics(ctx context.Context, req *Empty) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CollectStatistics not implemented")
}
func (*UnimplementedOpenoltServer) GetOnuStatistics(ctx context.Context, req *Onu) (*OnuStatistics, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetOnuStatistics not implemented")
}
func (*UnimplementedOpenoltServer) GetGemPortStatistics(ctx context.Context, req *OnuPacket) (*GemPortStatistics, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetGemPortStatistics not implemented")
}
func (*UnimplementedOpenoltServer) CreateTrafficSchedulers(ctx context.Context, req *tech_profile.TrafficSchedulers) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateTrafficSchedulers not implemented")
}
func (*UnimplementedOpenoltServer) RemoveTrafficSchedulers(ctx context.Context, req *tech_profile.TrafficSchedulers) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RemoveTrafficSchedulers not implemented")
}
func (*UnimplementedOpenoltServer) CreateTrafficQueues(ctx context.Context, req *tech_profile.TrafficQueues) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method CreateTrafficQueues not implemented")
}
func (*UnimplementedOpenoltServer) RemoveTrafficQueues(ctx context.Context, req *tech_profile.TrafficQueues) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method RemoveTrafficQueues not implemented")
}
func (*UnimplementedOpenoltServer) EnableIndication(req *Empty, srv Openolt_EnableIndicationServer) error {
	return status.Errorf(codes.Unimplemented, "method EnableIndication not implemented")
}
func (*UnimplementedOpenoltServer) PerformGroupOperation(ctx context.Context, req *Group) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method PerformGroupOperation not implemented")
}
func (*UnimplementedOpenoltServer) DeleteGroup(ctx context.Context, req *Group) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method DeleteGroup not implemented")
}
func (*UnimplementedOpenoltServer) GetExtValue(ctx context.Context, req *ValueParam) (*extension.ReturnValues, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetExtValue not implemented")
}
func (*UnimplementedOpenoltServer) OnuItuPonAlarmSet(ctx context.Context, req *config.OnuItuPonAlarm) (*Empty, error) {
	return nil, status.Errorf(codes.Unimplemented, "method OnuItuPonAlarmSet not implemented")
}
func (*UnimplementedOpenoltServer) GetLogicalOnuDistanceZero(ctx context.Context, req *Onu) (*OnuLogicalDistance, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetLogicalOnuDistanceZero not implemented")
}
func (*UnimplementedOpenoltServer) GetLogicalOnuDistance(ctx context.Context, req *Onu) (*OnuLogicalDistance, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetLogicalOnuDistance not implemented")
}
func (*UnimplementedOpenoltServer) GetPonRxPower(ctx context.Context, req *Onu) (*PonRxPowerData, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetPonRxPower not implemented")
}
func (*UnimplementedOpenoltServer) GetObject(ctx context.Context, req *ObjectDataRequest) (*ObjectDataResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method GetObject not implemented")
}

func RegisterOpenoltServer(s *grpc.Server, srv OpenoltServer) {
	s.RegisterService(&_Openolt_serviceDesc, srv)
}

func _Openolt_DisableOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DisableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ReenableOlt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).ReenableOlt(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ReenableOlt",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ReenableOlt(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_ActivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).ActivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/ActivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).ActivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeactivateOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeactivateOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeactivateOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeactivateOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeleteOnu_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeleteOnu(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeleteOnu",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeleteOnu(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OmciMsgOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OmciMsg)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OmciMsgOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OmciMsgOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OmciMsgOut(ctx, req.(*OmciMsg))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OnuPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OnuPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OnuPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OnuPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OnuPacketOut(ctx, req.(*OnuPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_UplinkPacketOut_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(UplinkPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/UplinkPacketOut",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).UplinkPacketOut(ctx, req.(*UplinkPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowAdd(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowAdd",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowAdd(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_FlowRemove_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Flow)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).FlowRemove(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/FlowRemove",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).FlowRemove(ctx, req.(*Flow))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_HeartbeatCheck_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).HeartbeatCheck(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/HeartbeatCheck",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).HeartbeatCheck(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).EnablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/EnablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).EnablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DisablePonIf_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Interface)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DisablePonIf(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DisablePonIf",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DisablePonIf(ctx, req.(*Interface))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetDeviceInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetDeviceInfo(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetDeviceInfo",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetDeviceInfo(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_Reboot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).Reboot(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/Reboot",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).Reboot(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CollectStatistics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Empty)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CollectStatistics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CollectStatistics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CollectStatistics(ctx, req.(*Empty))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetOnuStatistics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetOnuStatistics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetOnuStatistics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetOnuStatistics(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetGemPortStatistics_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(OnuPacket)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetGemPortStatistics(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetGemPortStatistics",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetGemPortStatistics(ctx, req.(*OnuPacket))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficSchedulers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficSchedulers)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficSchedulers",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficSchedulers(ctx, req.(*tech_profile.TrafficSchedulers))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_CreateTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/CreateTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).CreateTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_RemoveTrafficQueues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(tech_profile.TrafficQueues)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/RemoveTrafficQueues",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).RemoveTrafficQueues(ctx, req.(*tech_profile.TrafficQueues))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_EnableIndication_Handler(srv interface{}, stream grpc.ServerStream) error {
	m := new(Empty)
	if err := stream.RecvMsg(m); err != nil {
		return err
	}
	return srv.(OpenoltServer).EnableIndication(m, &openoltEnableIndicationServer{stream})
}

type Openolt_EnableIndicationServer interface {
	Send(*Indication) error
	grpc.ServerStream
}

type openoltEnableIndicationServer struct {
	grpc.ServerStream
}

func (x *openoltEnableIndicationServer) Send(m *Indication) error {
	return x.ServerStream.SendMsg(m)
}

func _Openolt_PerformGroupOperation_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Group)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).PerformGroupOperation(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/PerformGroupOperation",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).PerformGroupOperation(ctx, req.(*Group))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_DeleteGroup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Group)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).DeleteGroup(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/DeleteGroup",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).DeleteGroup(ctx, req.(*Group))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetExtValue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ValueParam)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetExtValue(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetExtValue",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetExtValue(ctx, req.(*ValueParam))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_OnuItuPonAlarmSet_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(config.OnuItuPonAlarm)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/OnuItuPonAlarmSet",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).OnuItuPonAlarmSet(ctx, req.(*config.OnuItuPonAlarm))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetLogicalOnuDistanceZero_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetLogicalOnuDistanceZero",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetLogicalOnuDistanceZero(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetLogicalOnuDistance_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetLogicalOnuDistance",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetLogicalOnuDistance(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetPonRxPower_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(Onu)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetPonRxPower(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetPonRxPower",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetPonRxPower(ctx, req.(*Onu))
	}
	return interceptor(ctx, in, info, handler)
}

func _Openolt_GetObject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(ObjectDataRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(OpenoltServer).GetObject(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/openolt.Openolt/GetObject",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(OpenoltServer).GetObject(ctx, req.(*ObjectDataRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _Openolt_serviceDesc = grpc.ServiceDesc{
	ServiceName: "openolt.Openolt",
	HandlerType: (*OpenoltServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "DisableOlt",
			Handler:    _Openolt_DisableOlt_Handler,
		},
		{
			MethodName: "ReenableOlt",
			Handler:    _Openolt_ReenableOlt_Handler,
		},
		{
			MethodName: "ActivateOnu",
			Handler:    _Openolt_ActivateOnu_Handler,
		},
		{
			MethodName: "DeactivateOnu",
			Handler:    _Openolt_DeactivateOnu_Handler,
		},
		{
			MethodName: "DeleteOnu",
			Handler:    _Openolt_DeleteOnu_Handler,
		},
		{
			MethodName: "OmciMsgOut",
			Handler:    _Openolt_OmciMsgOut_Handler,
		},
		{
			MethodName: "OnuPacketOut",
			Handler:    _Openolt_OnuPacketOut_Handler,
		},
		{
			MethodName: "UplinkPacketOut",
			Handler:    _Openolt_UplinkPacketOut_Handler,
		},
		{
			MethodName: "FlowAdd",
			Handler:    _Openolt_FlowAdd_Handler,
		},
		{
			MethodName: "FlowRemove",
			Handler:    _Openolt_FlowRemove_Handler,
		},
		{
			MethodName: "HeartbeatCheck",
			Handler:    _Openolt_HeartbeatCheck_Handler,
		},
		{
			MethodName: "EnablePonIf",
			Handler:    _Openolt_EnablePonIf_Handler,
		},
		{
			MethodName: "DisablePonIf",
			Handler:    _Openolt_DisablePonIf_Handler,
		},
		{
			MethodName: "GetDeviceInfo",
			Handler:    _Openolt_GetDeviceInfo_Handler,
		},
		{
			MethodName: "Reboot",
			Handler:    _Openolt_Reboot_Handler,
		},
		{
			MethodName: "CollectStatistics",
			Handler:    _Openolt_CollectStatistics_Handler,
		},
		{
			MethodName: "GetOnuStatistics",
			Handler:    _Openolt_GetOnuStatistics_Handler,
		},
		{
			MethodName: "GetGemPortStatistics",
			Handler:    _Openolt_GetGemPortStatistics_Handler,
		},
		{
			MethodName: "CreateTrafficSchedulers",
			Handler:    _Openolt_CreateTrafficSchedulers_Handler,
		},
		{
			MethodName: "RemoveTrafficSchedulers",
			Handler:    _Openolt_RemoveTrafficSchedulers_Handler,
		},
		{
			MethodName: "CreateTrafficQueues",
			Handler:    _Openolt_CreateTrafficQueues_Handler,
		},
		{
			MethodName: "RemoveTrafficQueues",
			Handler:    _Openolt_RemoveTrafficQueues_Handler,
		},
		{
			MethodName: "PerformGroupOperation",
			Handler:    _Openolt_PerformGroupOperation_Handler,
		},
		{
			MethodName: "DeleteGroup",
			Handler:    _Openolt_DeleteGroup_Handler,
		},
		{
			MethodName: "GetExtValue",
			Handler:    _Openolt_GetExtValue_Handler,
		},
		{
			MethodName: "OnuItuPonAlarmSet",
			Handler:    _Openolt_OnuItuPonAlarmSet_Handler,
		},
		{
			MethodName: "GetLogicalOnuDistanceZero",
			Handler:    _Openolt_GetLogicalOnuDistanceZero_Handler,
		},
		{
			MethodName: "GetLogicalOnuDistance",
			Handler:    _Openolt_GetLogicalOnuDistance_Handler,
		},
		{
			MethodName: "GetPonRxPower",
			Handler:    _Openolt_GetPonRxPower_Handler,
		},
		{
			MethodName: "GetObject",
			Handler:    _Openolt_GetObject_Handler,
		},
	},
	Streams: []grpc.StreamDesc{
		{
			StreamName:    "EnableIndication",
			Handler:       _Openolt_EnableIndication_Handler,
			ServerStreams: true,
		},
	},
	Metadata: "voltha_protos/openolt.proto",
}
