// 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
	TransceiverComponentsAttributes_QSFP_DD             TransceiverComponentsAttributes_FormFactor = 15
)

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",
	15: "QSFP_DD",
}

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,
	"QSFP_DD":             15,
}

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