// Code generated by protoc-gen-go. DO NOT EDIT.
// source: dmi/hw.proto

package dmi

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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 ComponentType int32

const (
	ComponentType_COMPONENT_TYPE_UNDEFINED    ComponentType = 0
	ComponentType_COMPONENT_TYPE_UNKNOWN      ComponentType = 1
	ComponentType_COMPONENT_TYPE_CHASSIS      ComponentType = 2
	ComponentType_COMPONENT_TYPE_BACKPLANE    ComponentType = 3
	ComponentType_COMPONENT_TYPE_CONTAINER    ComponentType = 4
	ComponentType_COMPONENT_TYPE_POWER_SUPPLY ComponentType = 5
	ComponentType_COMPONENT_TYPE_FAN          ComponentType = 6
	ComponentType_COMPONENT_TYPE_SENSOR       ComponentType = 7
	ComponentType_COMPONENT_TYPE_MODULE       ComponentType = 8
	ComponentType_COMPONENT_TYPE_PORT         ComponentType = 9
	ComponentType_COMPONENT_TYPE_CPU          ComponentType = 10
	ComponentType_COMPONENT_TYPE_BATTERY      ComponentType = 11
	ComponentType_COMPONENT_TYPE_STORAGE      ComponentType = 12
	ComponentType_COMPONENT_TYPE_MEMORY       ComponentType = 13
	// A component of type "TRANSCEIVER" could have 0 or more components of type "PORT" as children.
	ComponentType_COMPONENT_TYPE_TRANSCEIVER ComponentType = 14
)

var ComponentType_name = map[int32]string{
	0:  "COMPONENT_TYPE_UNDEFINED",
	1:  "COMPONENT_TYPE_UNKNOWN",
	2:  "COMPONENT_TYPE_CHASSIS",
	3:  "COMPONENT_TYPE_BACKPLANE",
	4:  "COMPONENT_TYPE_CONTAINER",
	5:  "COMPONENT_TYPE_POWER_SUPPLY",
	6:  "COMPONENT_TYPE_FAN",
	7:  "COMPONENT_TYPE_SENSOR",
	8:  "COMPONENT_TYPE_MODULE",
	9:  "COMPONENT_TYPE_PORT",
	10: "COMPONENT_TYPE_CPU",
	11: "COMPONENT_TYPE_BATTERY",
	12: "COMPONENT_TYPE_STORAGE",
	13: "COMPONENT_TYPE_MEMORY",
	14: "COMPONENT_TYPE_TRANSCEIVER",
}

var ComponentType_value = map[string]int32{
	"COMPONENT_TYPE_UNDEFINED":    0,
	"COMPONENT_TYPE_UNKNOWN":      1,
	"COMPONENT_TYPE_CHASSIS":      2,
	"COMPONENT_TYPE_BACKPLANE":    3,
	"COMPONENT_TYPE_CONTAINER":    4,
	"COMPONENT_TYPE_POWER_SUPPLY": 5,
	"COMPONENT_TYPE_FAN":          6,
	"COMPONENT_TYPE_SENSOR":       7,
	"COMPONENT_TYPE_MODULE":       8,
	"COMPONENT_TYPE_PORT":         9,
	"COMPONENT_TYPE_CPU":          10,
	"COMPONENT_TYPE_BATTERY":      11,
	"COMPONENT_TYPE_STORAGE":      12,
	"COMPONENT_TYPE_MEMORY":       13,
	"COMPONENT_TYPE_TRANSCEIVER":  14,
}

func (x ComponentType) String() string {
	return proto.EnumName(ComponentType_name, int32(x))
}

func (ComponentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{0}
}

type ComponentAdminState int32

const (
	ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED     ComponentAdminState = 0
	ComponentAdminState_COMP_ADMIN_STATE_UNKNOWN       ComponentAdminState = 1
	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
)

var ComponentAdminState_name = map[int32]string{
	0: "COMP_ADMIN_STATE_UNDEFINED",
	1: "COMP_ADMIN_STATE_UNKNOWN",
	2: "COMP_ADMIN_STATE_LOCKED",
	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
	4: "COMP_ADMIN_STATE_UNLOCKED",
}

var ComponentAdminState_value = map[string]int32{
	"COMP_ADMIN_STATE_UNDEFINED":     0,
	"COMP_ADMIN_STATE_UNKNOWN":       1,
	"COMP_ADMIN_STATE_LOCKED":        2,
	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
	"COMP_ADMIN_STATE_UNLOCKED":      4,
}

func (x ComponentAdminState) String() string {
	return proto.EnumName(ComponentAdminState_name, int32(x))
}

func (ComponentAdminState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{1}
}

type ComponentOperState int32

const (
	ComponentOperState_COMP_OPER_STATE_UNDEFINED ComponentOperState = 0
	ComponentOperState_COMP_OPER_STATE_UNKNOWN   ComponentOperState = 1
	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
)

var ComponentOperState_name = map[int32]string{
	0: "COMP_OPER_STATE_UNDEFINED",
	1: "COMP_OPER_STATE_UNKNOWN",
	2: "COMP_OPER_STATE_DISABLED",
	3: "COMP_OPER_STATE_ENABLED",
	4: "COMP_OPER_STATE_TESTING",
}

var ComponentOperState_value = map[string]int32{
	"COMP_OPER_STATE_UNDEFINED": 0,
	"COMP_OPER_STATE_UNKNOWN":   1,
	"COMP_OPER_STATE_DISABLED":  2,
	"COMP_OPER_STATE_ENABLED":   3,
	"COMP_OPER_STATE_TESTING":   4,
}

func (x ComponentOperState) String() string {
	return proto.EnumName(ComponentOperState_name, int32(x))
}

func (ComponentOperState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{2}
}

type ComponentUsageState int32

const (
	ComponentUsageState_COMP_USAGE_STATE_UNDEFINED ComponentUsageState = 0
	ComponentUsageState_COMP_USAGE_STATE_UNKNOWN   ComponentUsageState = 1
	ComponentUsageState_COMP_USAGE_STATE_IDLE      ComponentUsageState = 2
	ComponentUsageState_COMP_USAGE_STATE_ACTIVE    ComponentUsageState = 3
	ComponentUsageState_COMP_USAGE_STATE_BUSY      ComponentUsageState = 4
)

var ComponentUsageState_name = map[int32]string{
	0: "COMP_USAGE_STATE_UNDEFINED",
	1: "COMP_USAGE_STATE_UNKNOWN",
	2: "COMP_USAGE_STATE_IDLE",
	3: "COMP_USAGE_STATE_ACTIVE",
	4: "COMP_USAGE_STATE_BUSY",
}

var ComponentUsageState_value = map[string]int32{
	"COMP_USAGE_STATE_UNDEFINED": 0,
	"COMP_USAGE_STATE_UNKNOWN":   1,
	"COMP_USAGE_STATE_IDLE":      2,
	"COMP_USAGE_STATE_ACTIVE":    3,
	"COMP_USAGE_STATE_BUSY":      4,
}

func (x ComponentUsageState) String() string {
	return proto.EnumName(ComponentUsageState_name, int32(x))
}

func (ComponentUsageState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{3}
}

type ComponentAlarmState int32

const (
	ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED     ComponentAlarmState = 0
	ComponentAlarmState_COMP_ALARM_STATE_UNKNOWN       ComponentAlarmState = 1
	ComponentAlarmState_COMP_ALARM_STATE_UNDER_REPAIR  ComponentAlarmState = 2
	ComponentAlarmState_COMP_ALARM_STATE_CRITICAL      ComponentAlarmState = 3
	ComponentAlarmState_COMP_ALARM_STATE_MAJOR         ComponentAlarmState = 4
	ComponentAlarmState_COMP_ALARM_STATE_MINOR         ComponentAlarmState = 5
	ComponentAlarmState_COMP_ALARM_STATE_WARNING       ComponentAlarmState = 6
	ComponentAlarmState_COMP_ALARM_STATE_INDETERMINATE ComponentAlarmState = 7
)

var ComponentAlarmState_name = map[int32]string{
	0: "COMP_ALARM_STATE_UNDEFINED",
	1: "COMP_ALARM_STATE_UNKNOWN",
	2: "COMP_ALARM_STATE_UNDER_REPAIR",
	3: "COMP_ALARM_STATE_CRITICAL",
	4: "COMP_ALARM_STATE_MAJOR",
	5: "COMP_ALARM_STATE_MINOR",
	6: "COMP_ALARM_STATE_WARNING",
	7: "COMP_ALARM_STATE_INDETERMINATE",
}

var ComponentAlarmState_value = map[string]int32{
	"COMP_ALARM_STATE_UNDEFINED":     0,
	"COMP_ALARM_STATE_UNKNOWN":       1,
	"COMP_ALARM_STATE_UNDER_REPAIR":  2,
	"COMP_ALARM_STATE_CRITICAL":      3,
	"COMP_ALARM_STATE_MAJOR":         4,
	"COMP_ALARM_STATE_MINOR":         5,
	"COMP_ALARM_STATE_WARNING":       6,
	"COMP_ALARM_STATE_INDETERMINATE": 7,
}

func (x ComponentAlarmState) String() string {
	return proto.EnumName(ComponentAlarmState_name, int32(x))
}

func (ComponentAlarmState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{4}
}

type ComponentStandbyState int32

const (
	ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED         ComponentStandbyState = 0
	ComponentStandbyState_COMP_STANDBY_STATE_UNKNOWN           ComponentStandbyState = 1
	ComponentStandbyState_COMP_STANDBY_STATE_HOT               ComponentStandbyState = 2
	ComponentStandbyState_COMP_STANDBY_STATE_COLD              ComponentStandbyState = 3
	ComponentStandbyState_COMP_STANDBY_STATE_PROVIDING_SERVICE ComponentStandbyState = 4
)

var ComponentStandbyState_name = map[int32]string{
	0: "COMP_STANDBY_STATE_UNDEFINED",
	1: "COMP_STANDBY_STATE_UNKNOWN",
	2: "COMP_STANDBY_STATE_HOT",
	3: "COMP_STANDBY_STATE_COLD",
	4: "COMP_STANDBY_STATE_PROVIDING_SERVICE",
}

var ComponentStandbyState_value = map[string]int32{
	"COMP_STANDBY_STATE_UNDEFINED":         0,
	"COMP_STANDBY_STATE_UNKNOWN":           1,
	"COMP_STANDBY_STATE_HOT":               2,
	"COMP_STANDBY_STATE_COLD":              3,
	"COMP_STANDBY_STATE_PROVIDING_SERVICE": 4,
}

func (x ComponentStandbyState) String() string {
	return proto.EnumName(ComponentStandbyState_name, int32(x))
}

func (ComponentStandbyState) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5}
}

type DataValueType int32

const (
	DataValueType_VALUE_TYPE_UNDEFINED   DataValueType = 0
	DataValueType_VALUE_TYPE_OTHER       DataValueType = 1
	DataValueType_VALUE_TYPE_UNKNOWN     DataValueType = 2
	DataValueType_VALUE_TYPE_VOLTS_AC    DataValueType = 3
	DataValueType_VALUE_TYPE_VOLTS_DC    DataValueType = 4
	DataValueType_VALUE_TYPE_AMPERES     DataValueType = 5
	DataValueType_VALUE_TYPE_WATTS       DataValueType = 6
	DataValueType_VALUE_TYPE_HERTZ       DataValueType = 7
	DataValueType_VALUE_TYPE_CELSIUS     DataValueType = 8
	DataValueType_VALUE_TYPE_PERCENT_RH  DataValueType = 9
	DataValueType_VALUE_TYPE_RPM         DataValueType = 10
	DataValueType_VALUE_TYPE_CMM         DataValueType = 11
	DataValueType_VALUE_TYPE_TRUTH_VALUE DataValueType = 12
	DataValueType_VALUE_TYPE_PERCENT     DataValueType = 13
	DataValueType_VALUE_TYPE_METERS      DataValueType = 14
	DataValueType_VALUE_TYPE_BYTES       DataValueType = 15
	DataValueType_VALUE_TYPE_DBM         DataValueType = 16
)

var DataValueType_name = map[int32]string{
	0:  "VALUE_TYPE_UNDEFINED",
	1:  "VALUE_TYPE_OTHER",
	2:  "VALUE_TYPE_UNKNOWN",
	3:  "VALUE_TYPE_VOLTS_AC",
	4:  "VALUE_TYPE_VOLTS_DC",
	5:  "VALUE_TYPE_AMPERES",
	6:  "VALUE_TYPE_WATTS",
	7:  "VALUE_TYPE_HERTZ",
	8:  "VALUE_TYPE_CELSIUS",
	9:  "VALUE_TYPE_PERCENT_RH",
	10: "VALUE_TYPE_RPM",
	11: "VALUE_TYPE_CMM",
	12: "VALUE_TYPE_TRUTH_VALUE",
	13: "VALUE_TYPE_PERCENT",
	14: "VALUE_TYPE_METERS",
	15: "VALUE_TYPE_BYTES",
	16: "VALUE_TYPE_DBM",
}

var DataValueType_value = map[string]int32{
	"VALUE_TYPE_UNDEFINED":   0,
	"VALUE_TYPE_OTHER":       1,
	"VALUE_TYPE_UNKNOWN":     2,
	"VALUE_TYPE_VOLTS_AC":    3,
	"VALUE_TYPE_VOLTS_DC":    4,
	"VALUE_TYPE_AMPERES":     5,
	"VALUE_TYPE_WATTS":       6,
	"VALUE_TYPE_HERTZ":       7,
	"VALUE_TYPE_CELSIUS":     8,
	"VALUE_TYPE_PERCENT_RH":  9,
	"VALUE_TYPE_RPM":         10,
	"VALUE_TYPE_CMM":         11,
	"VALUE_TYPE_TRUTH_VALUE": 12,
	"VALUE_TYPE_PERCENT":     13,
	"VALUE_TYPE_METERS":      14,
	"VALUE_TYPE_BYTES":       15,
	"VALUE_TYPE_DBM":         16,
}

func (x DataValueType) String() string {
	return proto.EnumName(DataValueType_name, int32(x))
}

func (DataValueType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{6}
}

type ValueScale int32

const (
	ValueScale_VALUE_SCALE_UNDEFINED ValueScale = 0
	ValueScale_VALUE_SCALE_YOCTO     ValueScale = 1
	ValueScale_VALUE_SCALE_ZEPTO     ValueScale = 2
	ValueScale_VALUE_SCALE_ATTO      ValueScale = 3
	ValueScale_VALUE_SCALE_FEMTO     ValueScale = 4
	ValueScale_VALUE_SCALE_PICO      ValueScale = 5
	ValueScale_VALUE_SCALE_NANO      ValueScale = 6
	ValueScale_VALUE_SCALE_MICRO     ValueScale = 7
	ValueScale_VALUE_SCALE_MILLI     ValueScale = 8
	ValueScale_VALUE_SCALE_UNITS     ValueScale = 9
	ValueScale_VALUE_SCALE_KILO      ValueScale = 10
	ValueScale_VALUE_SCALE_MEGA      ValueScale = 11
	ValueScale_VALUE_SCALE_GIGA      ValueScale = 12
	ValueScale_VALUE_SCALE_TERA      ValueScale = 13
	ValueScale_VALUE_SCALE_PETA      ValueScale = 14
	ValueScale_VALUE_SCALE_EXA       ValueScale = 15
	ValueScale_VALUE_SCALE_ZETTA     ValueScale = 16
	ValueScale_VALUE_SCALE_YOTTA     ValueScale = 17
)

var ValueScale_name = map[int32]string{
	0:  "VALUE_SCALE_UNDEFINED",
	1:  "VALUE_SCALE_YOCTO",
	2:  "VALUE_SCALE_ZEPTO",
	3:  "VALUE_SCALE_ATTO",
	4:  "VALUE_SCALE_FEMTO",
	5:  "VALUE_SCALE_PICO",
	6:  "VALUE_SCALE_NANO",
	7:  "VALUE_SCALE_MICRO",
	8:  "VALUE_SCALE_MILLI",
	9:  "VALUE_SCALE_UNITS",
	10: "VALUE_SCALE_KILO",
	11: "VALUE_SCALE_MEGA",
	12: "VALUE_SCALE_GIGA",
	13: "VALUE_SCALE_TERA",
	14: "VALUE_SCALE_PETA",
	15: "VALUE_SCALE_EXA",
	16: "VALUE_SCALE_ZETTA",
	17: "VALUE_SCALE_YOTTA",
}

var ValueScale_value = map[string]int32{
	"VALUE_SCALE_UNDEFINED": 0,
	"VALUE_SCALE_YOCTO":     1,
	"VALUE_SCALE_ZEPTO":     2,
	"VALUE_SCALE_ATTO":      3,
	"VALUE_SCALE_FEMTO":     4,
	"VALUE_SCALE_PICO":      5,
	"VALUE_SCALE_NANO":      6,
	"VALUE_SCALE_MICRO":     7,
	"VALUE_SCALE_MILLI":     8,
	"VALUE_SCALE_UNITS":     9,
	"VALUE_SCALE_KILO":      10,
	"VALUE_SCALE_MEGA":      11,
	"VALUE_SCALE_GIGA":      12,
	"VALUE_SCALE_TERA":      13,
	"VALUE_SCALE_PETA":      14,
	"VALUE_SCALE_EXA":       15,
	"VALUE_SCALE_ZETTA":     16,
	"VALUE_SCALE_YOTTA":     17,
}

func (x ValueScale) String() string {
	return proto.EnumName(ValueScale_name, int32(x))
}

func (ValueScale) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{7}
}

type SensorStatus int32

const (
	SensorStatus_SENSOR_STATUS_UNDEFINED      SensorStatus = 0
	SensorStatus_SENSOR_STATUS_OK             SensorStatus = 1
	SensorStatus_SENSOR_STATUS_UNAVAILABLE    SensorStatus = 2
	SensorStatus_SENSOR_STATUS_NONOPERATIONAL SensorStatus = 3
)

var SensorStatus_name = map[int32]string{
	0: "SENSOR_STATUS_UNDEFINED",
	1: "SENSOR_STATUS_OK",
	2: "SENSOR_STATUS_UNAVAILABLE",
	3: "SENSOR_STATUS_NONOPERATIONAL",
}

var SensorStatus_value = map[string]int32{
	"SENSOR_STATUS_UNDEFINED":      0,
	"SENSOR_STATUS_OK":             1,
	"SENSOR_STATUS_UNAVAILABLE":    2,
	"SENSOR_STATUS_NONOPERATIONAL": 3,
}

func (x SensorStatus) String() string {
	return proto.EnumName(SensorStatus_name, int32(x))
}

func (SensorStatus) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{8}
}

type TransceiverType int32

const (
	TransceiverType_TYPE_UNDEFINED    TransceiverType = 0
	TransceiverType_ETHERNET          TransceiverType = 1
	TransceiverType_GPON              TransceiverType = 2
	TransceiverType_XGPON             TransceiverType = 3
	TransceiverType_XGSPON            TransceiverType = 4
	TransceiverType_CPON              TransceiverType = 5
	TransceiverType_NG_PON2           TransceiverType = 6
	TransceiverType_EPON              TransceiverType = 7
	TransceiverType_COMBO_GPON_XGSPON TransceiverType = 8
	TransceiverType_TYPE_NOT_DETECTED TransceiverType = 255
)

var TransceiverType_name = map[int32]string{
	0:   "TYPE_UNDEFINED",
	1:   "ETHERNET",
	2:   "GPON",
	3:   "XGPON",
	4:   "XGSPON",
	5:   "CPON",
	6:   "NG_PON2",
	7:   "EPON",
	8:   "COMBO_GPON_XGSPON",
	255: "TYPE_NOT_DETECTED",
}

var TransceiverType_value = map[string]int32{
	"TYPE_UNDEFINED":    0,
	"ETHERNET":          1,
	"GPON":              2,
	"XGPON":             3,
	"XGSPON":            4,
	"CPON":              5,
	"NG_PON2":           6,
	"EPON":              7,
	"COMBO_GPON_XGSPON": 8,
	"TYPE_NOT_DETECTED": 255,
}

func (x TransceiverType) String() string {
	return proto.EnumName(TransceiverType_name, int32(x))
}

func (TransceiverType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{9}
}

type PortComponentAttributes_ConnectorType int32

const (
	PortComponentAttributes_CONNECTOR_TYPE_UNDEFINED PortComponentAttributes_ConnectorType = 0
	PortComponentAttributes_RJ45                     PortComponentAttributes_ConnectorType = 1
	PortComponentAttributes_FIBER_LC                 PortComponentAttributes_ConnectorType = 2
	PortComponentAttributes_FIBER_SC_PC              PortComponentAttributes_ConnectorType = 3
	PortComponentAttributes_FIBER_MPO                PortComponentAttributes_ConnectorType = 4
	PortComponentAttributes_RS232                    PortComponentAttributes_ConnectorType = 5
)

var PortComponentAttributes_ConnectorType_name = map[int32]string{
	0: "CONNECTOR_TYPE_UNDEFINED",
	1: "RJ45",
	2: "FIBER_LC",
	3: "FIBER_SC_PC",
	4: "FIBER_MPO",
	5: "RS232",
}

var PortComponentAttributes_ConnectorType_value = map[string]int32{
	"CONNECTOR_TYPE_UNDEFINED": 0,
	"RJ45":                     1,
	"FIBER_LC":                 2,
	"FIBER_SC_PC":              3,
	"FIBER_MPO":                4,
	"RS232":                    5,
}

func (x PortComponentAttributes_ConnectorType) String() string {
	return proto.EnumName(PortComponentAttributes_ConnectorType_name, int32(x))
}

func (PortComponentAttributes_ConnectorType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 0}
}

type PortComponentAttributes_Speed int32

const (
	PortComponentAttributes_SPEED_UNDEFINED PortComponentAttributes_Speed = 0
	PortComponentAttributes_DYNAMIC         PortComponentAttributes_Speed = 1
	PortComponentAttributes_GIGABIT_1       PortComponentAttributes_Speed = 2
	PortComponentAttributes_GIGABIT_10      PortComponentAttributes_Speed = 3
	PortComponentAttributes_GIGABIT_25      PortComponentAttributes_Speed = 4
	PortComponentAttributes_GIGABIT_40      PortComponentAttributes_Speed = 5
	PortComponentAttributes_GIGABIT_100     PortComponentAttributes_Speed = 6
	PortComponentAttributes_GIGABIT_400     PortComponentAttributes_Speed = 7
	PortComponentAttributes_MEGABIT_2500    PortComponentAttributes_Speed = 8
	PortComponentAttributes_MEGABIT_1250    PortComponentAttributes_Speed = 9
)

var PortComponentAttributes_Speed_name = map[int32]string{
	0: "SPEED_UNDEFINED",
	1: "DYNAMIC",
	2: "GIGABIT_1",
	3: "GIGABIT_10",
	4: "GIGABIT_25",
	5: "GIGABIT_40",
	6: "GIGABIT_100",
	7: "GIGABIT_400",
	8: "MEGABIT_2500",
	9: "MEGABIT_1250",
}

var PortComponentAttributes_Speed_value = map[string]int32{
	"SPEED_UNDEFINED": 0,
	"DYNAMIC":         1,
	"GIGABIT_1":       2,
	"GIGABIT_10":      3,
	"GIGABIT_25":      4,
	"GIGABIT_40":      5,
	"GIGABIT_100":     6,
	"GIGABIT_400":     7,
	"MEGABIT_2500":    8,
	"MEGABIT_1250":    9,
}

func (x PortComponentAttributes_Speed) String() string {
	return proto.EnumName(PortComponentAttributes_Speed_name, int32(x))
}

func (PortComponentAttributes_Speed) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 1}
}

type PortComponentAttributes_Protocol int32

const (
	PortComponentAttributes_PROTOCOL_UNDEFINED PortComponentAttributes_Protocol = 0
	PortComponentAttributes_ETHERNET           PortComponentAttributes_Protocol = 1
	PortComponentAttributes_GPON               PortComponentAttributes_Protocol = 2
	PortComponentAttributes_XGPON              PortComponentAttributes_Protocol = 3
	PortComponentAttributes_XGSPON             PortComponentAttributes_Protocol = 4
	PortComponentAttributes_GFAST              PortComponentAttributes_Protocol = 5
	PortComponentAttributes_SERIAL             PortComponentAttributes_Protocol = 6
	PortComponentAttributes_EPON               PortComponentAttributes_Protocol = 7
	PortComponentAttributes_BITS               PortComponentAttributes_Protocol = 8
)

var PortComponentAttributes_Protocol_name = map[int32]string{
	0: "PROTOCOL_UNDEFINED",
	1: "ETHERNET",
	2: "GPON",
	3: "XGPON",
	4: "XGSPON",
	5: "GFAST",
	6: "SERIAL",
	7: "EPON",
	8: "BITS",
}

var PortComponentAttributes_Protocol_value = map[string]int32{
	"PROTOCOL_UNDEFINED": 0,
	"ETHERNET":           1,
	"GPON":               2,
	"XGPON":              3,
	"XGSPON":             4,
	"GFAST":              5,
	"SERIAL":             6,
	"EPON":               7,
	"BITS":               8,
}

func (x PortComponentAttributes_Protocol) String() string {
	return proto.EnumName(PortComponentAttributes_Protocol_name, int32(x))
}

func (PortComponentAttributes_Protocol) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{5, 2}
}

type PsuComponentAttributes_SupportedVoltage int32

const (
	PsuComponentAttributes_SUPPORTED_VOLTAGE_UNDEFINED PsuComponentAttributes_SupportedVoltage = 0
	PsuComponentAttributes_V48                         PsuComponentAttributes_SupportedVoltage = 1
	PsuComponentAttributes_V230                        PsuComponentAttributes_SupportedVoltage = 2
	PsuComponentAttributes_V115                        PsuComponentAttributes_SupportedVoltage = 3
)

var PsuComponentAttributes_SupportedVoltage_name = map[int32]string{
	0: "SUPPORTED_VOLTAGE_UNDEFINED",
	1: "V48",
	2: "V230",
	3: "V115",
}

var PsuComponentAttributes_SupportedVoltage_value = map[string]int32{
	"SUPPORTED_VOLTAGE_UNDEFINED": 0,
	"V48":                         1,
	"V230":                        2,
	"V115":                        3,
}

func (x PsuComponentAttributes_SupportedVoltage) String() string {
	return proto.EnumName(PsuComponentAttributes_SupportedVoltage_name, int32(x))
}

func (PsuComponentAttributes_SupportedVoltage) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{11, 0}
}

type TransceiverComponentsAttributes_FormFactor int32

const (
	TransceiverComponentsAttributes_FORM_FACTOR_UNKNOWN TransceiverComponentsAttributes_FormFactor = 0
	TransceiverComponentsAttributes_QSFP                TransceiverComponentsAttributes_FormFactor = 1
	TransceiverComponentsAttributes_QSFP_PLUS           TransceiverComponentsAttributes_FormFactor = 2
	TransceiverComponentsAttributes_QSFP28              TransceiverComponentsAttributes_FormFactor = 3
	TransceiverComponentsAttributes_SFP                 TransceiverComponentsAttributes_FormFactor = 4
	TransceiverComponentsAttributes_SFP_PLUS            TransceiverComponentsAttributes_FormFactor = 5
	TransceiverComponentsAttributes_XFP                 TransceiverComponentsAttributes_FormFactor = 6
	TransceiverComponentsAttributes_CFP4                TransceiverComponentsAttributes_FormFactor = 7
	TransceiverComponentsAttributes_CFP2                TransceiverComponentsAttributes_FormFactor = 8
	TransceiverComponentsAttributes_CPAK                TransceiverComponentsAttributes_FormFactor = 9
	TransceiverComponentsAttributes_X2                  TransceiverComponentsAttributes_FormFactor = 10
	TransceiverComponentsAttributes_OTHER               TransceiverComponentsAttributes_FormFactor = 11
	TransceiverComponentsAttributes_CFP                 TransceiverComponentsAttributes_FormFactor = 12
	TransceiverComponentsAttributes_CFP2_ACO            TransceiverComponentsAttributes_FormFactor = 13
	TransceiverComponentsAttributes_CFP2_DCO            TransceiverComponentsAttributes_FormFactor = 14
)

var TransceiverComponentsAttributes_FormFactor_name = map[int32]string{
	0:  "FORM_FACTOR_UNKNOWN",
	1:  "QSFP",
	2:  "QSFP_PLUS",
	3:  "QSFP28",
	4:  "SFP",
	5:  "SFP_PLUS",
	6:  "XFP",
	7:  "CFP4",
	8:  "CFP2",
	9:  "CPAK",
	10: "X2",
	11: "OTHER",
	12: "CFP",
	13: "CFP2_ACO",
	14: "CFP2_DCO",
}

var TransceiverComponentsAttributes_FormFactor_value = map[string]int32{
	"FORM_FACTOR_UNKNOWN": 0,
	"QSFP":                1,
	"QSFP_PLUS":           2,
	"QSFP28":              3,
	"SFP":                 4,
	"SFP_PLUS":            5,
	"XFP":                 6,
	"CFP4":                7,
	"CFP2":                8,
	"CPAK":                9,
	"X2":                  10,
	"OTHER":               11,
	"CFP":                 12,
	"CFP2_ACO":            13,
	"CFP2_DCO":            14,
}

func (x TransceiverComponentsAttributes_FormFactor) String() string {
	return proto.EnumName(TransceiverComponentsAttributes_FormFactor_name, int32(x))
}

func (TransceiverComponentsAttributes_FormFactor) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_d7c33d745c4ab367, []int{12, 0}
}

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

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

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

var xxx_messageInfo_Uuid proto.InternalMessageInfo

func (m *Uuid) GetUuid() string {
	if m != nil {
		return m.Uuid
	}
	return ""
}

type HardwareID struct {
	Uuid                 *Uuid    `protobuf:"bytes,1,opt,name=uuid,proto3" json:"uuid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_HardwareID proto.InternalMessageInfo

func (m *HardwareID) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

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

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

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

var xxx_messageInfo_Uri proto.InternalMessageInfo

func (m *Uri) GetUri() string {
	if m != nil {
		return m.Uri
	}
	return ""
}

type ComponentState struct {
	StateLastChanged     *timestamp.Timestamp  `protobuf:"bytes,1,opt,name=state_last_changed,json=stateLastChanged,proto3" json:"state_last_changed,omitempty"`
	AdminState           ComponentAdminState   `protobuf:"varint,2,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	OperState            ComponentOperState    `protobuf:"varint,3,opt,name=oper_state,json=operState,proto3,enum=dmi.ComponentOperState" json:"oper_state,omitempty"`
	UsageState           ComponentUsageState   `protobuf:"varint,4,opt,name=usage_state,json=usageState,proto3,enum=dmi.ComponentUsageState" json:"usage_state,omitempty"`
	AlarmState           ComponentAlarmState   `protobuf:"varint,5,opt,name=alarm_state,json=alarmState,proto3,enum=dmi.ComponentAlarmState" json:"alarm_state,omitempty"`
	StandbyState         ComponentStandbyState `protobuf:"varint,6,opt,name=standby_state,json=standbyState,proto3,enum=dmi.ComponentStandbyState" json:"standby_state,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

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

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

var xxx_messageInfo_ComponentState proto.InternalMessageInfo

func (m *ComponentState) GetStateLastChanged() *timestamp.Timestamp {
	if m != nil {
		return m.StateLastChanged
	}
	return nil
}

func (m *ComponentState) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

func (m *ComponentState) GetOperState() ComponentOperState {
	if m != nil {
		return m.OperState
	}
	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
}

func (m *ComponentState) GetUsageState() ComponentUsageState {
	if m != nil {
		return m.UsageState
	}
	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
}

func (m *ComponentState) GetAlarmState() ComponentAlarmState {
	if m != nil {
		return m.AlarmState
	}
	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
}

func (m *ComponentState) GetStandbyState() ComponentStandbyState {
	if m != nil {
		return m.StandbyState
	}
	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
}

type ComponentSensorData struct {
	Value           int32                `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"`
	Type            DataValueType        `protobuf:"varint,2,opt,name=type,proto3,enum=dmi.DataValueType" json:"type,omitempty"`
	Scale           ValueScale           `protobuf:"varint,3,opt,name=scale,proto3,enum=dmi.ValueScale" json:"scale,omitempty"`
	Precision       int32                `protobuf:"varint,4,opt,name=precision,proto3" json:"precision,omitempty"`
	Status          SensorStatus         `protobuf:"varint,5,opt,name=status,proto3,enum=dmi.SensorStatus" json:"status,omitempty"`
	UnitsDisplay    string               `protobuf:"bytes,6,opt,name=units_display,json=unitsDisplay,proto3" json:"units_display,omitempty"`
	Timestamp       *timestamp.Timestamp `protobuf:"bytes,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	ValueUpdateRate uint32               `protobuf:"varint,8,opt,name=value_update_rate,json=valueUpdateRate,proto3" json:"value_update_rate,omitempty"`
	// data_type can be of the string representation of MetricNames or something else as well
	DataType             string   `protobuf:"bytes,9,opt,name=data_type,json=dataType,proto3" json:"data_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ComponentSensorData proto.InternalMessageInfo

func (m *ComponentSensorData) GetValue() int32 {
	if m != nil {
		return m.Value
	}
	return 0
}

func (m *ComponentSensorData) GetType() DataValueType {
	if m != nil {
		return m.Type
	}
	return DataValueType_VALUE_TYPE_UNDEFINED
}

func (m *ComponentSensorData) GetScale() ValueScale {
	if m != nil {
		return m.Scale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

func (m *ComponentSensorData) GetPrecision() int32 {
	if m != nil {
		return m.Precision
	}
	return 0
}

func (m *ComponentSensorData) GetStatus() SensorStatus {
	if m != nil {
		return m.Status
	}
	return SensorStatus_SENSOR_STATUS_UNDEFINED
}

func (m *ComponentSensorData) GetUnitsDisplay() string {
	if m != nil {
		return m.UnitsDisplay
	}
	return ""
}

func (m *ComponentSensorData) GetTimestamp() *timestamp.Timestamp {
	if m != nil {
		return m.Timestamp
	}
	return nil
}

func (m *ComponentSensorData) GetValueUpdateRate() uint32 {
	if m != nil {
		return m.ValueUpdateRate
	}
	return 0
}

func (m *ComponentSensorData) GetDataType() string {
	if m != nil {
		return m.DataType
	}
	return ""
}

type PortComponentAttributes struct {
	ConnectorType PortComponentAttributes_ConnectorType `protobuf:"varint,1,opt,name=connector_type,json=connectorType,proto3,enum=dmi.PortComponentAttributes_ConnectorType" json:"connector_type,omitempty"`
	Speed         PortComponentAttributes_Speed         `protobuf:"varint,2,opt,name=speed,proto3,enum=dmi.PortComponentAttributes_Speed" json:"speed,omitempty"`
	Protocol      PortComponentAttributes_Protocol      `protobuf:"varint,3,opt,name=protocol,proto3,enum=dmi.PortComponentAttributes_Protocol" json:"protocol,omitempty"`
	PhysicalLabel string                                `protobuf:"bytes,4,opt,name=physical_label,json=physicalLabel,proto3" json:"physical_label,omitempty"`
	// The mapping_label can be used to map ports between the DMI interface and other systems like VOLTHA
	// The value of the mapping_label should be exactly the same as generated for the same port by the other
	// system
	MappingLabel         string       `protobuf:"bytes,5,opt,name=mapping_label,json=mappingLabel,proto3" json:"mapping_label,omitempty"`
	PonIdConfig          *PonIdConfig `protobuf:"bytes,6,opt,name=pon_id_config,json=ponIdConfig,proto3" json:"pon_id_config,omitempty"`
	SpeedAutonegotiation bool         `protobuf:"varint,7,opt,name=speed_autonegotiation,json=speedAutonegotiation,proto3" json:"speed_autonegotiation,omitempty"`
	Distance             *PonDistance `protobuf:"bytes,8,opt,name=distance,proto3" json:"distance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_PortComponentAttributes proto.InternalMessageInfo

func (m *PortComponentAttributes) GetConnectorType() PortComponentAttributes_ConnectorType {
	if m != nil {
		return m.ConnectorType
	}
	return PortComponentAttributes_CONNECTOR_TYPE_UNDEFINED
}

func (m *PortComponentAttributes) GetSpeed() PortComponentAttributes_Speed {
	if m != nil {
		return m.Speed
	}
	return PortComponentAttributes_SPEED_UNDEFINED
}

func (m *PortComponentAttributes) GetProtocol() PortComponentAttributes_Protocol {
	if m != nil {
		return m.Protocol
	}
	return PortComponentAttributes_PROTOCOL_UNDEFINED
}

func (m *PortComponentAttributes) GetPhysicalLabel() string {
	if m != nil {
		return m.PhysicalLabel
	}
	return ""
}

func (m *PortComponentAttributes) GetMappingLabel() string {
	if m != nil {
		return m.MappingLabel
	}
	return ""
}

func (m *PortComponentAttributes) GetPonIdConfig() *PonIdConfig {
	if m != nil {
		return m.PonIdConfig
	}
	return nil
}

func (m *PortComponentAttributes) GetSpeedAutonegotiation() bool {
	if m != nil {
		return m.SpeedAutonegotiation
	}
	return false
}

func (m *PortComponentAttributes) GetDistance() *PonDistance {
	if m != nil {
		return m.Distance
	}
	return nil
}

type PonDistance struct {
	//
	// The ITU-T G.987.x series of Recommendations addresses the linear extent parameters of XG-PON
	// using the single concept of fibre distance. An ONU is characterized by its fibre distance, and for
	// each pair of ONUs on the same OLT PON interface, the differential fibre distance is the difference
	// between the two individual fibre distances. Each specific PMD layer parameter set contains a
	// provision to support a specific maximum fibre distance. The XG-PON TC layer specification
	// contains a provision to support specific ranges of maximum fibre distance and maximum
	// differential fibre distance. These ranges can be configurable for a given system. One can expect that
	// for each XG-PON deployment, the configured TC layer maximum fibre distance will match the
	// maximum fibre distance supported by the selected PMD layer parameter set.
	MaxDistance             uint32   `protobuf:"varint,1,opt,name=max_distance,json=maxDistance,proto3" json:"max_distance,omitempty"`
	MaxDifferentialDistance uint32   `protobuf:"varint,2,opt,name=max_differential_distance,json=maxDifferentialDistance,proto3" json:"max_differential_distance,omitempty"`
	XXX_NoUnkeyedLiteral    struct{} `json:"-"`
	XXX_unrecognized        []byte   `json:"-"`
	XXX_sizecache           int32    `json:"-"`
}

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

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

var xxx_messageInfo_PonDistance proto.InternalMessageInfo

func (m *PonDistance) GetMaxDistance() uint32 {
	if m != nil {
		return m.MaxDistance
	}
	return 0
}

func (m *PonDistance) GetMaxDifferentialDistance() uint32 {
	if m != nil {
		return m.MaxDifferentialDistance
	}
	return 0
}

type PortComponentChangeAttributes struct {
	PonIdConfig          *PonIdConfig `protobuf:"bytes,1,opt,name=pon_id_config,json=ponIdConfig,proto3" json:"pon_id_config,omitempty"`
	Distance             *PonDistance `protobuf:"bytes,2,opt,name=distance,proto3" json:"distance,omitempty"`
	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
	XXX_unrecognized     []byte       `json:"-"`
	XXX_sizecache        int32        `json:"-"`
}

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

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

var xxx_messageInfo_PortComponentChangeAttributes proto.InternalMessageInfo

func (m *PortComponentChangeAttributes) GetPonIdConfig() *PonIdConfig {
	if m != nil {
		return m.PonIdConfig
	}
	return nil
}

func (m *PortComponentChangeAttributes) GetDistance() *PonDistance {
	if m != nil {
		return m.Distance
	}
	return nil
}

type TransceiverComponentChangeAttributes struct {
	TransType            TransceiverType `protobuf:"varint,1,opt,name=trans_type,json=transType,proto3,enum=dmi.TransceiverType" json:"trans_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

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

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

var xxx_messageInfo_TransceiverComponentChangeAttributes proto.InternalMessageInfo

func (m *TransceiverComponentChangeAttributes) GetTransType() TransceiverType {
	if m != nil {
		return m.TransType
	}
	return TransceiverType_TYPE_UNDEFINED
}

type PonIdConfig struct {
	// The pon_id and pon_id_transmit_periodicity attributes are valid only for ports of type GPON, XGPON and XGSPON
	// For GPON pon_id is a 7 byte value
	// For XGS-PON, it's a 32 bit value, should be encoded in the first 4 bytes of pon_id in network byte order
	PonId                    []byte   `protobuf:"bytes,1,opt,name=pon_id,json=ponId,proto3" json:"pon_id,omitempty"`
	PonIdTransmitPeriodicity uint32   `protobuf:"varint,2,opt,name=pon_id_transmit_periodicity,json=ponIdTransmitPeriodicity,proto3" json:"pon_id_transmit_periodicity,omitempty"`
	XXX_NoUnkeyedLiteral     struct{} `json:"-"`
	XXX_unrecognized         []byte   `json:"-"`
	XXX_sizecache            int32    `json:"-"`
}

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

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

var xxx_messageInfo_PonIdConfig proto.InternalMessageInfo

func (m *PonIdConfig) GetPonId() []byte {
	if m != nil {
		return m.PonId
	}
	return nil
}

func (m *PonIdConfig) GetPonIdTransmitPeriodicity() uint32 {
	if m != nil {
		return m.PonIdTransmitPeriodicity
	}
	return 0
}

type ContainerComponentAttributes struct {
	PhysicalLabel        string   `protobuf:"bytes,1,opt,name=physical_label,json=physicalLabel,proto3" json:"physical_label,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ContainerComponentAttributes proto.InternalMessageInfo

func (m *ContainerComponentAttributes) GetPhysicalLabel() string {
	if m != nil {
		return m.PhysicalLabel
	}
	return ""
}

type PsuComponentAttributes struct {
	SupportedVoltage     PsuComponentAttributes_SupportedVoltage `protobuf:"varint,1,opt,name=supported_voltage,json=supportedVoltage,proto3,enum=dmi.PsuComponentAttributes_SupportedVoltage" json:"supported_voltage,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

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

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

var xxx_messageInfo_PsuComponentAttributes proto.InternalMessageInfo

func (m *PsuComponentAttributes) GetSupportedVoltage() PsuComponentAttributes_SupportedVoltage {
	if m != nil {
		return m.SupportedVoltage
	}
	return PsuComponentAttributes_SUPPORTED_VOLTAGE_UNDEFINED
}

type TransceiverComponentsAttributes struct {
	FormFactor TransceiverComponentsAttributes_FormFactor `protobuf:"varint,1,opt,name=form_factor,json=formFactor,proto3,enum=dmi.TransceiverComponentsAttributes_FormFactor" json:"form_factor,omitempty"`
	TransType  TransceiverType                            `protobuf:"varint,2,opt,name=trans_type,json=transType,proto3,enum=dmi.TransceiverType" json:"trans_type,omitempty"`
	// The maximum reach that can be achieved by this transceiver
	MaxDistance      uint32     `protobuf:"varint,3,opt,name=max_distance,json=maxDistance,proto3" json:"max_distance,omitempty"`
	MaxDistanceScale ValueScale `protobuf:"varint,4,opt,name=max_distance_scale,json=maxDistanceScale,proto3,enum=dmi.ValueScale" json:"max_distance_scale,omitempty"`
	// The receive and transmit wavelengths that the transeiver operates on
	RxWavelength    []uint32   `protobuf:"varint,5,rep,packed,name=rx_wavelength,json=rxWavelength,proto3" json:"rx_wavelength,omitempty"`
	TxWavelength    []uint32   `protobuf:"varint,6,rep,packed,name=tx_wavelength,json=txWavelength,proto3" json:"tx_wavelength,omitempty"`
	WavelengthScale ValueScale `protobuf:"varint,7,opt,name=wavelength_scale,json=wavelengthScale,proto3,enum=dmi.ValueScale" json:"wavelength_scale,omitempty"`
	// The tx powers on the transceiver; the value type of tx_power should be dBm.
	// Note: When there are multiple rx/tx wavelengths and powers
	// each of the corresponding ones should be aligned on the same index of the array
	TxPower              []int32    `protobuf:"varint,8,rep,packed,name=tx_power,json=txPower,proto3" json:"tx_power,omitempty"`
	TxPowerScale         ValueScale `protobuf:"varint,9,opt,name=tx_power_scale,json=txPowerScale,proto3,enum=dmi.ValueScale" json:"tx_power_scale,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_TransceiverComponentsAttributes proto.InternalMessageInfo

func (m *TransceiverComponentsAttributes) GetFormFactor() TransceiverComponentsAttributes_FormFactor {
	if m != nil {
		return m.FormFactor
	}
	return TransceiverComponentsAttributes_FORM_FACTOR_UNKNOWN
}

func (m *TransceiverComponentsAttributes) GetTransType() TransceiverType {
	if m != nil {
		return m.TransType
	}
	return TransceiverType_TYPE_UNDEFINED
}

func (m *TransceiverComponentsAttributes) GetMaxDistance() uint32 {
	if m != nil {
		return m.MaxDistance
	}
	return 0
}

func (m *TransceiverComponentsAttributes) GetMaxDistanceScale() ValueScale {
	if m != nil {
		return m.MaxDistanceScale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

func (m *TransceiverComponentsAttributes) GetRxWavelength() []uint32 {
	if m != nil {
		return m.RxWavelength
	}
	return nil
}

func (m *TransceiverComponentsAttributes) GetTxWavelength() []uint32 {
	if m != nil {
		return m.TxWavelength
	}
	return nil
}

func (m *TransceiverComponentsAttributes) GetWavelengthScale() ValueScale {
	if m != nil {
		return m.WavelengthScale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

func (m *TransceiverComponentsAttributes) GetTxPower() []int32 {
	if m != nil {
		return m.TxPower
	}
	return nil
}

func (m *TransceiverComponentsAttributes) GetTxPowerScale() ValueScale {
	if m != nil {
		return m.TxPowerScale
	}
	return ValueScale_VALUE_SCALE_UNDEFINED
}

type Component struct {
	// The name of a component uniquely identifies a component within the hardware
	Name        string        `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class       ComponentType `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Description string        `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"`
	// The name of the parent of this component, empty string("") in case of the root component
	Parent       string       `protobuf:"bytes,4,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos int32        `protobuf:"varint,5,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Children     []*Component `protobuf:"bytes,6,rep,name=children,proto3" json:"children,omitempty"`
	HardwareRev  string       `protobuf:"bytes,7,opt,name=hardware_rev,json=hardwareRev,proto3" json:"hardware_rev,omitempty"`
	FirmwareRev  string       `protobuf:"bytes,8,opt,name=firmware_rev,json=firmwareRev,proto3" json:"firmware_rev,omitempty"`
	SoftwareRev  string       `protobuf:"bytes,9,opt,name=software_rev,json=softwareRev,proto3" json:"software_rev,omitempty"`
	SerialNum    string       `protobuf:"bytes,10,opt,name=serial_num,json=serialNum,proto3" json:"serial_num,omitempty"`
	MfgName      string       `protobuf:"bytes,11,opt,name=mfg_name,json=mfgName,proto3" json:"mfg_name,omitempty"`
	// Apart from the definition of this attribute as defined in RFC 8348, implementations could choose to carry
	// the manufacturer's part number in this attribute.
	ModelName string               `protobuf:"bytes,12,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
	Alias     string               `protobuf:"bytes,13,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId   string               `protobuf:"bytes,14,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	IsFru     bool                 `protobuf:"varint,15,opt,name=is_fru,json=isFru,proto3" json:"is_fru,omitempty"`
	MfgDate   *timestamp.Timestamp `protobuf:"bytes,16,opt,name=mfg_date,json=mfgDate,proto3" json:"mfg_date,omitempty"`
	Uri       *Uri                 `protobuf:"bytes,17,opt,name=uri,proto3" json:"uri,omitempty"`
	// The uuid of the component uniquely identifies the component across the entire system
	Uuid       *Uuid                  `protobuf:"bytes,18,opt,name=uuid,proto3" json:"uuid,omitempty"`
	State      *ComponentState        `protobuf:"bytes,19,opt,name=state,proto3" json:"state,omitempty"`
	SensorData []*ComponentSensorData `protobuf:"bytes,20,rep,name=sensor_data,json=sensorData,proto3" json:"sensor_data,omitempty"`
	// The attribute 'specific' can be populated for components where more details are required by the users of the DMI interface
	//
	// Types that are valid to be assigned to Specific:
	//	*Component_PortAttr
	//	*Component_ContainerAttr
	//	*Component_PsuAttr
	//	*Component_TransceiverAttr
	Specific             isComponent_Specific `protobuf_oneof:"specific"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Component proto.InternalMessageInfo

func (m *Component) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Component) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

func (m *Component) GetDescription() string {
	if m != nil {
		return m.Description
	}
	return ""
}

func (m *Component) GetParent() string {
	if m != nil {
		return m.Parent
	}
	return ""
}

func (m *Component) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *Component) GetChildren() []*Component {
	if m != nil {
		return m.Children
	}
	return nil
}

func (m *Component) GetHardwareRev() string {
	if m != nil {
		return m.HardwareRev
	}
	return ""
}

func (m *Component) GetFirmwareRev() string {
	if m != nil {
		return m.FirmwareRev
	}
	return ""
}

func (m *Component) GetSoftwareRev() string {
	if m != nil {
		return m.SoftwareRev
	}
	return ""
}

func (m *Component) GetSerialNum() string {
	if m != nil {
		return m.SerialNum
	}
	return ""
}

func (m *Component) GetMfgName() string {
	if m != nil {
		return m.MfgName
	}
	return ""
}

func (m *Component) GetModelName() string {
	if m != nil {
		return m.ModelName
	}
	return ""
}

func (m *Component) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *Component) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *Component) GetIsFru() bool {
	if m != nil {
		return m.IsFru
	}
	return false
}

func (m *Component) GetMfgDate() *timestamp.Timestamp {
	if m != nil {
		return m.MfgDate
	}
	return nil
}

func (m *Component) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *Component) GetUuid() *Uuid {
	if m != nil {
		return m.Uuid
	}
	return nil
}

func (m *Component) GetState() *ComponentState {
	if m != nil {
		return m.State
	}
	return nil
}

func (m *Component) GetSensorData() []*ComponentSensorData {
	if m != nil {
		return m.SensorData
	}
	return nil
}

type isComponent_Specific interface {
	isComponent_Specific()
}

type Component_PortAttr struct {
	PortAttr *PortComponentAttributes `protobuf:"bytes,50,opt,name=port_attr,json=portAttr,proto3,oneof"`
}

type Component_ContainerAttr struct {
	ContainerAttr *ContainerComponentAttributes `protobuf:"bytes,51,opt,name=container_attr,json=containerAttr,proto3,oneof"`
}

type Component_PsuAttr struct {
	PsuAttr *PsuComponentAttributes `protobuf:"bytes,52,opt,name=psu_attr,json=psuAttr,proto3,oneof"`
}

type Component_TransceiverAttr struct {
	TransceiverAttr *TransceiverComponentsAttributes `protobuf:"bytes,53,opt,name=transceiver_attr,json=transceiverAttr,proto3,oneof"`
}

func (*Component_PortAttr) isComponent_Specific() {}

func (*Component_ContainerAttr) isComponent_Specific() {}

func (*Component_PsuAttr) isComponent_Specific() {}

func (*Component_TransceiverAttr) isComponent_Specific() {}

func (m *Component) GetSpecific() isComponent_Specific {
	if m != nil {
		return m.Specific
	}
	return nil
}

func (m *Component) GetPortAttr() *PortComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_PortAttr); ok {
		return x.PortAttr
	}
	return nil
}

func (m *Component) GetContainerAttr() *ContainerComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_ContainerAttr); ok {
		return x.ContainerAttr
	}
	return nil
}

func (m *Component) GetPsuAttr() *PsuComponentAttributes {
	if x, ok := m.GetSpecific().(*Component_PsuAttr); ok {
		return x.PsuAttr
	}
	return nil
}

func (m *Component) GetTransceiverAttr() *TransceiverComponentsAttributes {
	if x, ok := m.GetSpecific().(*Component_TransceiverAttr); ok {
		return x.TransceiverAttr
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*Component) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*Component_PortAttr)(nil),
		(*Component_ContainerAttr)(nil),
		(*Component_PsuAttr)(nil),
		(*Component_TransceiverAttr)(nil),
	}
}

type Hardware struct {
	LastChange *timestamp.Timestamp `protobuf:"bytes,1,opt,name=last_change,json=lastChange,proto3" json:"last_change,omitempty"`
	// Each HW has one parent/root and all other components are children of this
	// The class of the root component would be set as UNDEFINED
	Root *Component `protobuf:"bytes,2,opt,name=root,proto3" json:"root,omitempty"`
	// TODO: Authentication?
	// Timestamp at which the hardware last booted
	LastBooted           *timestamp.Timestamp `protobuf:"bytes,3,opt,name=last_booted,json=lastBooted,proto3" json:"last_booted,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

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

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

var xxx_messageInfo_Hardware proto.InternalMessageInfo

func (m *Hardware) GetLastChange() *timestamp.Timestamp {
	if m != nil {
		return m.LastChange
	}
	return nil
}

func (m *Hardware) GetRoot() *Component {
	if m != nil {
		return m.Root
	}
	return nil
}

func (m *Hardware) GetLastBooted() *timestamp.Timestamp {
	if m != nil {
		return m.LastBooted
	}
	return nil
}

// The attributes of a component which are modifiable from the client side
type ModifiableComponent struct {
	// The name has to be unique for each component within the hardware and implementations need to
	// ascertain this when modifying the name
	Name         string              `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	Class        ComponentType       `protobuf:"varint,2,opt,name=class,proto3,enum=dmi.ComponentType" json:"class,omitempty"`
	Parent       *Component          `protobuf:"bytes,3,opt,name=parent,proto3" json:"parent,omitempty"`
	ParentRelPos int32               `protobuf:"varint,4,opt,name=parent_rel_pos,json=parentRelPos,proto3" json:"parent_rel_pos,omitempty"`
	Alias        string              `protobuf:"bytes,5,opt,name=alias,proto3" json:"alias,omitempty"`
	AssetId      string              `protobuf:"bytes,6,opt,name=asset_id,json=assetId,proto3" json:"asset_id,omitempty"`
	Uri          *Uri                `protobuf:"bytes,7,opt,name=uri,proto3" json:"uri,omitempty"`
	AdminState   ComponentAdminState `protobuf:"varint,8,opt,name=admin_state,json=adminState,proto3,enum=dmi.ComponentAdminState" json:"admin_state,omitempty"`
	// The attribute 'specific' can be populated for specific class of components
	//
	// Types that are valid to be assigned to Specific:
	//	*ModifiableComponent_PortAttr
	//	*ModifiableComponent_TrxAttr
	Specific             isModifiableComponent_Specific `protobuf_oneof:"specific"`
	XXX_NoUnkeyedLiteral struct{}                       `json:"-"`
	XXX_unrecognized     []byte                         `json:"-"`
	XXX_sizecache        int32                          `json:"-"`
}

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

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

var xxx_messageInfo_ModifiableComponent proto.InternalMessageInfo

func (m *ModifiableComponent) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *ModifiableComponent) GetClass() ComponentType {
	if m != nil {
		return m.Class
	}
	return ComponentType_COMPONENT_TYPE_UNDEFINED
}

func (m *ModifiableComponent) GetParent() *Component {
	if m != nil {
		return m.Parent
	}
	return nil
}

func (m *ModifiableComponent) GetParentRelPos() int32 {
	if m != nil {
		return m.ParentRelPos
	}
	return 0
}

func (m *ModifiableComponent) GetAlias() string {
	if m != nil {
		return m.Alias
	}
	return ""
}

func (m *ModifiableComponent) GetAssetId() string {
	if m != nil {
		return m.AssetId
	}
	return ""
}

func (m *ModifiableComponent) GetUri() *Uri {
	if m != nil {
		return m.Uri
	}
	return nil
}

func (m *ModifiableComponent) GetAdminState() ComponentAdminState {
	if m != nil {
		return m.AdminState
	}
	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
}

type isModifiableComponent_Specific interface {
	isModifiableComponent_Specific()
}

type ModifiableComponent_PortAttr struct {
	PortAttr *PortComponentChangeAttributes `protobuf:"bytes,50,opt,name=port_attr,json=portAttr,proto3,oneof"`
}

type ModifiableComponent_TrxAttr struct {
	TrxAttr *TransceiverComponentChangeAttributes `protobuf:"bytes,51,opt,name=trx_attr,json=trxAttr,proto3,oneof"`
}

func (*ModifiableComponent_PortAttr) isModifiableComponent_Specific() {}

func (*ModifiableComponent_TrxAttr) isModifiableComponent_Specific() {}

func (m *ModifiableComponent) GetSpecific() isModifiableComponent_Specific {
	if m != nil {
		return m.Specific
	}
	return nil
}

func (m *ModifiableComponent) GetPortAttr() *PortComponentChangeAttributes {
	if x, ok := m.GetSpecific().(*ModifiableComponent_PortAttr); ok {
		return x.PortAttr
	}
	return nil
}

func (m *ModifiableComponent) GetTrxAttr() *TransceiverComponentChangeAttributes {
	if x, ok := m.GetSpecific().(*ModifiableComponent_TrxAttr); ok {
		return x.TrxAttr
	}
	return nil
}

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

func init() {
	proto.RegisterEnum("dmi.ComponentType", ComponentType_name, ComponentType_value)
	proto.RegisterEnum("dmi.ComponentAdminState", ComponentAdminState_name, ComponentAdminState_value)
	proto.RegisterEnum("dmi.ComponentOperState", ComponentOperState_name, ComponentOperState_value)
	proto.RegisterEnum("dmi.ComponentUsageState", ComponentUsageState_name, ComponentUsageState_value)
	proto.RegisterEnum("dmi.ComponentAlarmState", ComponentAlarmState_name, ComponentAlarmState_value)
	proto.RegisterEnum("dmi.ComponentStandbyState", ComponentStandbyState_name, ComponentStandbyState_value)
	proto.RegisterEnum("dmi.DataValueType", DataValueType_name, DataValueType_value)
	proto.RegisterEnum("dmi.ValueScale", ValueScale_name, ValueScale_value)
	proto.RegisterEnum("dmi.SensorStatus", SensorStatus_name, SensorStatus_value)
	proto.RegisterEnum("dmi.TransceiverType", TransceiverType_name, TransceiverType_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_ConnectorType", PortComponentAttributes_ConnectorType_name, PortComponentAttributes_ConnectorType_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_Speed", PortComponentAttributes_Speed_name, PortComponentAttributes_Speed_value)
	proto.RegisterEnum("dmi.PortComponentAttributes_Protocol", PortComponentAttributes_Protocol_name, PortComponentAttributes_Protocol_value)
	proto.RegisterEnum("dmi.PsuComponentAttributes_SupportedVoltage", PsuComponentAttributes_SupportedVoltage_name, PsuComponentAttributes_SupportedVoltage_value)
	proto.RegisterEnum("dmi.TransceiverComponentsAttributes_FormFactor", TransceiverComponentsAttributes_FormFactor_name, TransceiverComponentsAttributes_FormFactor_value)
	proto.RegisterType((*Uuid)(nil), "dmi.Uuid")
	proto.RegisterType((*HardwareID)(nil), "dmi.HardwareID")
	proto.RegisterType((*Uri)(nil), "dmi.Uri")
	proto.RegisterType((*ComponentState)(nil), "dmi.ComponentState")
	proto.RegisterType((*ComponentSensorData)(nil), "dmi.ComponentSensorData")
	proto.RegisterType((*PortComponentAttributes)(nil), "dmi.PortComponentAttributes")
	proto.RegisterType((*PonDistance)(nil), "dmi.PonDistance")
	proto.RegisterType((*PortComponentChangeAttributes)(nil), "dmi.PortComponentChangeAttributes")
	proto.RegisterType((*TransceiverComponentChangeAttributes)(nil), "dmi.TransceiverComponentChangeAttributes")
	proto.RegisterType((*PonIdConfig)(nil), "dmi.PonIdConfig")
	proto.RegisterType((*ContainerComponentAttributes)(nil), "dmi.ContainerComponentAttributes")
	proto.RegisterType((*PsuComponentAttributes)(nil), "dmi.PsuComponentAttributes")
	proto.RegisterType((*TransceiverComponentsAttributes)(nil), "dmi.TransceiverComponentsAttributes")
	proto.RegisterType((*Component)(nil), "dmi.Component")
	proto.RegisterType((*Hardware)(nil), "dmi.Hardware")
	proto.RegisterType((*ModifiableComponent)(nil), "dmi.ModifiableComponent")
}

func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }

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