Started working on WiFi settings template store&load

This commit is contained in:
MaMe82 2018-09-24 15:41:09 +02:00
parent 951f8be42f
commit 3c1ffdbeb5
13 changed files with 1015 additions and 251 deletions

View File

@ -8,10 +8,12 @@
grpc.proto
It has these top-level messages:
WifiRequestSettingsStorage
WiFiSettings
WiFiState
WiFiBSSCfg
StringMessage
StringMessageArray
EventRequest
EventValue
Event
@ -148,6 +150,88 @@ func (x EthernetInterfaceSettings_Mode) String() string {
return EthernetInterfaceSettings_Mode_name[int(x)]
}
type WifiRequestSettingsStorage struct {
TemplateName string
Settings *WiFiSettings
}
// GetTemplateName gets the TemplateName of the WifiRequestSettingsStorage.
func (m *WifiRequestSettingsStorage) GetTemplateName() (x string) {
if m == nil {
return x
}
return m.TemplateName
}
// GetSettings gets the Settings of the WifiRequestSettingsStorage.
func (m *WifiRequestSettingsStorage) GetSettings() (x *WiFiSettings) {
if m == nil {
return x
}
return m.Settings
}
// MarshalToWriter marshals WifiRequestSettingsStorage to the provided writer.
func (m *WifiRequestSettingsStorage) MarshalToWriter(writer jspb.Writer) {
if m == nil {
return
}
if len(m.TemplateName) > 0 {
writer.WriteString(1, m.TemplateName)
}
if m.Settings != nil {
writer.WriteMessage(2, func() {
m.Settings.MarshalToWriter(writer)
})
}
return
}
// Marshal marshals WifiRequestSettingsStorage to a slice of bytes.
func (m *WifiRequestSettingsStorage) Marshal() []byte {
writer := jspb.NewWriter()
m.MarshalToWriter(writer)
return writer.GetResult()
}
// UnmarshalFromReader unmarshals a WifiRequestSettingsStorage from the provided reader.
func (m *WifiRequestSettingsStorage) UnmarshalFromReader(reader jspb.Reader) *WifiRequestSettingsStorage {
for reader.Next() {
if m == nil {
m = &WifiRequestSettingsStorage{}
}
switch reader.GetFieldNumber() {
case 1:
m.TemplateName = reader.ReadString()
case 2:
reader.ReadMessage(func() {
m.Settings = m.Settings.UnmarshalFromReader(reader)
})
default:
reader.SkipField()
}
}
return m
}
// Unmarshal unmarshals a WifiRequestSettingsStorage from a slice of bytes.
func (m *WifiRequestSettingsStorage) Unmarshal(rawBytes []byte) (*WifiRequestSettingsStorage, error) {
reader := jspb.NewReader(rawBytes)
m = m.UnmarshalFromReader(reader)
if err := reader.Err(); err != nil {
return nil, err
}
return m, nil
}
type WiFiSettings struct {
// Generic
Name string
@ -609,6 +693,69 @@ func (m *StringMessage) Unmarshal(rawBytes []byte) (*StringMessage, error) {
return m, nil
}
type StringMessageArray struct {
MsgArray []string
}
// GetMsgArray gets the MsgArray of the StringMessageArray.
func (m *StringMessageArray) GetMsgArray() (x []string) {
if m == nil {
return x
}
return m.MsgArray
}
// MarshalToWriter marshals StringMessageArray to the provided writer.
func (m *StringMessageArray) MarshalToWriter(writer jspb.Writer) {
if m == nil {
return
}
for _, val := range m.MsgArray {
writer.WriteString(1, val)
}
return
}
// Marshal marshals StringMessageArray to a slice of bytes.
func (m *StringMessageArray) Marshal() []byte {
writer := jspb.NewWriter()
m.MarshalToWriter(writer)
return writer.GetResult()
}
// UnmarshalFromReader unmarshals a StringMessageArray from the provided reader.
func (m *StringMessageArray) UnmarshalFromReader(reader jspb.Reader) *StringMessageArray {
for reader.Next() {
if m == nil {
m = &StringMessageArray{}
}
switch reader.GetFieldNumber() {
case 1:
m.MsgArray = append(m.MsgArray, reader.ReadString())
default:
reader.SkipField()
}
}
return m
}
// Unmarshal unmarshals a StringMessageArray from a slice of bytes.
func (m *StringMessageArray) Unmarshal(rawBytes []byte) (*StringMessageArray, error) {
reader := jspb.NewReader(rawBytes)
m = m.UnmarshalFromReader(reader)
if err := reader.Err(); err != nil {
return nil, err
}
return m, nil
}
// Events
type EventRequest struct {
ListenType int64
@ -3115,6 +3262,12 @@ type P4WNP1Client interface {
DeployWiFiSettings(ctx context.Context, in *WiFiSettings, opts ...grpcweb.CallOption) (*WiFiState, error)
GetWiFiState(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*WiFiState, error)
ListenWiFiStateChanges(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*WiFiState, error)
// ToDo: Template requests (store, load, listStored)
StoreWifiSettings(ctx context.Context, in *WifiRequestSettingsStorage, opts ...grpcweb.CallOption) (*Empty, error)
GetStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*WiFiSettings, error)
DeployStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*WiFiState, error)
StoreDeployedWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*Empty, error)
ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error)
}
type p4WNP1Client struct {
@ -3384,3 +3537,48 @@ func (c *p4WNP1Client) ListenWiFiStateChanges(ctx context.Context, in *Empty, op
return new(WiFiState).Unmarshal(resp)
}
func (c *p4WNP1Client) StoreWifiSettings(ctx context.Context, in *WifiRequestSettingsStorage, opts ...grpcweb.CallOption) (*Empty, error) {
resp, err := c.client.RPCCall(ctx, "StoreWifiSettings", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(Empty).Unmarshal(resp)
}
func (c *p4WNP1Client) GetStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*WiFiSettings, error) {
resp, err := c.client.RPCCall(ctx, "GetStoredWifiSettingsList", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(WiFiSettings).Unmarshal(resp)
}
func (c *p4WNP1Client) DeployStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*WiFiState, error) {
resp, err := c.client.RPCCall(ctx, "DeployStoredWifiSettings", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(WiFiState).Unmarshal(resp)
}
func (c *p4WNP1Client) StoreDeployedWifiSettings(ctx context.Context, in *StringMessage, opts ...grpcweb.CallOption) (*Empty, error) {
resp, err := c.client.RPCCall(ctx, "StoreDeployedWifiSettings", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(Empty).Unmarshal(resp)
}
func (c *p4WNP1Client) ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpcweb.CallOption) (*StringMessageArray, error) {
resp, err := c.client.RPCCall(ctx, "ListStoredWifiSettings", in.Marshal(), opts...)
if err != nil {
return nil, err
}
return new(StringMessageArray).Unmarshal(resp)
}

View File

@ -8,10 +8,12 @@ It is generated from these files:
grpc.proto
It has these top-level messages:
WifiRequestSettingsStorage
WiFiSettings
WiFiState
WiFiBSSCfg
StringMessage
StringMessageArray
EventRequest
EventValue
Event
@ -159,7 +161,31 @@ func (x EthernetInterfaceSettings_Mode) String() string {
return proto.EnumName(EthernetInterfaceSettings_Mode_name, int32(x))
}
func (EthernetInterfaceSettings_Mode) EnumDescriptor() ([]byte, []int) {
return fileDescriptor0, []int{24, 0}
return fileDescriptor0, []int{26, 0}
}
type WifiRequestSettingsStorage struct {
TemplateName string `protobuf:"bytes,1,opt,name=TemplateName" json:"TemplateName,omitempty"`
Settings *WiFiSettings `protobuf:"bytes,2,opt,name=settings" json:"settings,omitempty"`
}
func (m *WifiRequestSettingsStorage) Reset() { *m = WifiRequestSettingsStorage{} }
func (m *WifiRequestSettingsStorage) String() string { return proto.CompactTextString(m) }
func (*WifiRequestSettingsStorage) ProtoMessage() {}
func (*WifiRequestSettingsStorage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (m *WifiRequestSettingsStorage) GetTemplateName() string {
if m != nil {
return m.TemplateName
}
return ""
}
func (m *WifiRequestSettingsStorage) GetSettings() *WiFiSettings {
if m != nil {
return m.Settings
}
return nil
}
type WiFiSettings struct {
@ -179,7 +205,7 @@ type WiFiSettings struct {
func (m *WiFiSettings) Reset() { *m = WiFiSettings{} }
func (m *WiFiSettings) String() string { return proto.CompactTextString(m) }
func (*WiFiSettings) ProtoMessage() {}
func (*WiFiSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
func (*WiFiSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (m *WiFiSettings) GetName() string {
if m != nil {
@ -261,7 +287,7 @@ type WiFiState struct {
func (m *WiFiState) Reset() { *m = WiFiState{} }
func (m *WiFiState) String() string { return proto.CompactTextString(m) }
func (*WiFiState) ProtoMessage() {}
func (*WiFiState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
func (*WiFiState) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (m *WiFiState) GetMode() WiFiStateMode {
if m != nil {
@ -299,7 +325,7 @@ type WiFiBSSCfg struct {
func (m *WiFiBSSCfg) Reset() { *m = WiFiBSSCfg{} }
func (m *WiFiBSSCfg) String() string { return proto.CompactTextString(m) }
func (*WiFiBSSCfg) ProtoMessage() {}
func (*WiFiBSSCfg) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
func (*WiFiBSSCfg) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (m *WiFiBSSCfg) GetSSID() string {
if m != nil {
@ -323,7 +349,7 @@ type StringMessage struct {
func (m *StringMessage) Reset() { *m = StringMessage{} }
func (m *StringMessage) String() string { return proto.CompactTextString(m) }
func (*StringMessage) ProtoMessage() {}
func (*StringMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
func (*StringMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (m *StringMessage) GetMsg() string {
if m != nil {
@ -332,6 +358,22 @@ func (m *StringMessage) GetMsg() string {
return ""
}
type StringMessageArray struct {
MsgArray []string `protobuf:"bytes,1,rep,name=msgArray" json:"msgArray,omitempty"`
}
func (m *StringMessageArray) Reset() { *m = StringMessageArray{} }
func (m *StringMessageArray) String() string { return proto.CompactTextString(m) }
func (*StringMessageArray) ProtoMessage() {}
func (*StringMessageArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (m *StringMessageArray) GetMsgArray() []string {
if m != nil {
return m.MsgArray
}
return nil
}
// Events
type EventRequest struct {
ListenType int64 `protobuf:"varint,1,opt,name=listenType" json:"listenType,omitempty"`
@ -340,7 +382,7 @@ type EventRequest struct {
func (m *EventRequest) Reset() { *m = EventRequest{} }
func (m *EventRequest) String() string { return proto.CompactTextString(m) }
func (*EventRequest) ProtoMessage() {}
func (*EventRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
func (*EventRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (m *EventRequest) GetListenType() int64 {
if m != nil {
@ -360,7 +402,7 @@ type EventValue struct {
func (m *EventValue) Reset() { *m = EventValue{} }
func (m *EventValue) String() string { return proto.CompactTextString(m) }
func (*EventValue) ProtoMessage() {}
func (*EventValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
func (*EventValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
type isEventValue_Val interface {
isEventValue_Val()
@ -499,7 +541,7 @@ type Event struct {
func (m *Event) Reset() { *m = Event{} }
func (m *Event) String() string { return proto.CompactTextString(m) }
func (*Event) ProtoMessage() {}
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
func (*Event) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (m *Event) GetType() int64 {
if m != nil {
@ -525,7 +567,7 @@ type TempDirOrFileRequest struct {
func (m *TempDirOrFileRequest) Reset() { *m = TempDirOrFileRequest{} }
func (m *TempDirOrFileRequest) String() string { return proto.CompactTextString(m) }
func (*TempDirOrFileRequest) ProtoMessage() {}
func (*TempDirOrFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} }
func (*TempDirOrFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (m *TempDirOrFileRequest) GetDir() string {
if m != nil {
@ -555,7 +597,7 @@ type TempDirOrFileResponse struct {
func (m *TempDirOrFileResponse) Reset() { *m = TempDirOrFileResponse{} }
func (m *TempDirOrFileResponse) String() string { return proto.CompactTextString(m) }
func (*TempDirOrFileResponse) ProtoMessage() {}
func (*TempDirOrFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} }
func (*TempDirOrFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (m *TempDirOrFileResponse) GetResultPath() string {
if m != nil {
@ -573,7 +615,7 @@ type ReadFileRequest struct {
func (m *ReadFileRequest) Reset() { *m = ReadFileRequest{} }
func (m *ReadFileRequest) String() string { return proto.CompactTextString(m) }
func (*ReadFileRequest) ProtoMessage() {}
func (*ReadFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} }
func (*ReadFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (m *ReadFileRequest) GetPath() string {
if m != nil {
@ -603,7 +645,7 @@ type ReadFileResponse struct {
func (m *ReadFileResponse) Reset() { *m = ReadFileResponse{} }
func (m *ReadFileResponse) String() string { return proto.CompactTextString(m) }
func (*ReadFileResponse) ProtoMessage() {}
func (*ReadFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} }
func (*ReadFileResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (m *ReadFileResponse) GetReadCount() int64 {
if m != nil {
@ -622,7 +664,7 @@ type WriteFileRequest struct {
func (m *WriteFileRequest) Reset() { *m = WriteFileRequest{} }
func (m *WriteFileRequest) String() string { return proto.CompactTextString(m) }
func (*WriteFileRequest) ProtoMessage() {}
func (*WriteFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} }
func (*WriteFileRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (m *WriteFileRequest) GetPath() string {
if m != nil {
@ -659,7 +701,7 @@ type FileInfoRequest struct {
func (m *FileInfoRequest) Reset() { *m = FileInfoRequest{} }
func (m *FileInfoRequest) String() string { return proto.CompactTextString(m) }
func (*FileInfoRequest) ProtoMessage() {}
func (*FileInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} }
func (*FileInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *FileInfoRequest) GetPath() string {
if m != nil {
@ -679,7 +721,7 @@ type FileInfoResponse struct {
func (m *FileInfoResponse) Reset() { *m = FileInfoResponse{} }
func (m *FileInfoResponse) String() string { return proto.CompactTextString(m) }
func (*FileInfoResponse) ProtoMessage() {}
func (*FileInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} }
func (*FileInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *FileInfoResponse) GetName() string {
if m != nil {
@ -725,7 +767,7 @@ type HIDScriptRequest struct {
func (m *HIDScriptRequest) Reset() { *m = HIDScriptRequest{} }
func (m *HIDScriptRequest) String() string { return proto.CompactTextString(m) }
func (*HIDScriptRequest) ProtoMessage() {}
func (*HIDScriptRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*HIDScriptRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *HIDScriptRequest) GetScriptPath() string {
if m != nil {
@ -748,7 +790,7 @@ type HIDScriptJob struct {
func (m *HIDScriptJob) Reset() { *m = HIDScriptJob{} }
func (m *HIDScriptJob) String() string { return proto.CompactTextString(m) }
func (*HIDScriptJob) ProtoMessage() {}
func (*HIDScriptJob) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*HIDScriptJob) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *HIDScriptJob) GetId() uint32 {
if m != nil {
@ -764,7 +806,7 @@ type HIDScriptJobList struct {
func (m *HIDScriptJobList) Reset() { *m = HIDScriptJobList{} }
func (m *HIDScriptJobList) String() string { return proto.CompactTextString(m) }
func (*HIDScriptJobList) ProtoMessage() {}
func (*HIDScriptJobList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*HIDScriptJobList) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *HIDScriptJobList) GetIds() []uint32 {
if m != nil {
@ -782,7 +824,7 @@ type HIDRunningJobStateResult struct {
func (m *HIDRunningJobStateResult) Reset() { *m = HIDRunningJobStateResult{} }
func (m *HIDRunningJobStateResult) String() string { return proto.CompactTextString(m) }
func (*HIDRunningJobStateResult) ProtoMessage() {}
func (*HIDRunningJobStateResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*HIDRunningJobStateResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *HIDRunningJobStateResult) GetId() int64 {
if m != nil {
@ -814,7 +856,7 @@ type HIDScriptResult struct {
func (m *HIDScriptResult) Reset() { *m = HIDScriptResult{} }
func (m *HIDScriptResult) String() string { return proto.CompactTextString(m) }
func (*HIDScriptResult) ProtoMessage() {}
func (*HIDScriptResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*HIDScriptResult) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *HIDScriptResult) GetJob() *HIDScriptJob {
if m != nil {
@ -845,7 +887,7 @@ type LEDSettings struct {
func (m *LEDSettings) Reset() { *m = LEDSettings{} }
func (m *LEDSettings) String() string { return proto.CompactTextString(m) }
func (*LEDSettings) ProtoMessage() {}
func (*LEDSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*LEDSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (m *LEDSettings) GetBlinkCount() uint32 {
if m != nil {
@ -877,7 +919,7 @@ type GadgetSettings struct {
func (m *GadgetSettings) Reset() { *m = GadgetSettings{} }
func (m *GadgetSettings) String() string { return proto.CompactTextString(m) }
func (*GadgetSettings) ProtoMessage() {}
func (*GadgetSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (*GadgetSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *GadgetSettings) GetEnabled() bool {
if m != nil {
@ -999,7 +1041,7 @@ type GadgetSettingsEthernet struct {
func (m *GadgetSettingsEthernet) Reset() { *m = GadgetSettingsEthernet{} }
func (m *GadgetSettingsEthernet) String() string { return proto.CompactTextString(m) }
func (*GadgetSettingsEthernet) ProtoMessage() {}
func (*GadgetSettingsEthernet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (*GadgetSettingsEthernet) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *GadgetSettingsEthernet) GetHostAddr() string {
if m != nil {
@ -1023,7 +1065,7 @@ type GadgetSettingsUMS struct {
func (m *GadgetSettingsUMS) Reset() { *m = GadgetSettingsUMS{} }
func (m *GadgetSettingsUMS) String() string { return proto.CompactTextString(m) }
func (*GadgetSettingsUMS) ProtoMessage() {}
func (*GadgetSettingsUMS) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (*GadgetSettingsUMS) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (m *GadgetSettingsUMS) GetCdrom() bool {
if m != nil {
@ -1048,7 +1090,7 @@ func (m *DeployedEthernetInterfaceSettings) Reset() { *m = DeployedEther
func (m *DeployedEthernetInterfaceSettings) String() string { return proto.CompactTextString(m) }
func (*DeployedEthernetInterfaceSettings) ProtoMessage() {}
func (*DeployedEthernetInterfaceSettings) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{23}
return fileDescriptor0, []int{25}
}
func (m *DeployedEthernetInterfaceSettings) GetList() []*EthernetInterfaceSettings {
@ -1071,7 +1113,7 @@ type EthernetInterfaceSettings struct {
func (m *EthernetInterfaceSettings) Reset() { *m = EthernetInterfaceSettings{} }
func (m *EthernetInterfaceSettings) String() string { return proto.CompactTextString(m) }
func (*EthernetInterfaceSettings) ProtoMessage() {}
func (*EthernetInterfaceSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (*EthernetInterfaceSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (m *EthernetInterfaceSettings) GetName() string {
if m != nil {
@ -1139,7 +1181,7 @@ type DHCPServerSettings struct {
func (m *DHCPServerSettings) Reset() { *m = DHCPServerSettings{} }
func (m *DHCPServerSettings) String() string { return proto.CompactTextString(m) }
func (*DHCPServerSettings) ProtoMessage() {}
func (*DHCPServerSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (*DHCPServerSettings) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (m *DHCPServerSettings) GetListenPort() uint32 {
if m != nil {
@ -1214,7 +1256,7 @@ type DHCPServerRange struct {
func (m *DHCPServerRange) Reset() { *m = DHCPServerRange{} }
func (m *DHCPServerRange) String() string { return proto.CompactTextString(m) }
func (*DHCPServerRange) ProtoMessage() {}
func (*DHCPServerRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (*DHCPServerRange) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (m *DHCPServerRange) GetRangeLower() string {
if m != nil {
@ -1246,7 +1288,7 @@ type DHCPServerStaticHost struct {
func (m *DHCPServerStaticHost) Reset() { *m = DHCPServerStaticHost{} }
func (m *DHCPServerStaticHost) String() string { return proto.CompactTextString(m) }
func (*DHCPServerStaticHost) ProtoMessage() {}
func (*DHCPServerStaticHost) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (*DHCPServerStaticHost) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (m *DHCPServerStaticHost) GetMac() string {
if m != nil {
@ -1268,13 +1310,15 @@ type Empty struct {
func (m *Empty) Reset() { *m = Empty{} }
func (m *Empty) String() string { return proto.CompactTextString(m) }
func (*Empty) ProtoMessage() {}
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (*Empty) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func init() {
proto.RegisterType((*WifiRequestSettingsStorage)(nil), "P4wnP1_grpc.WifiRequestSettingsStorage")
proto.RegisterType((*WiFiSettings)(nil), "P4wnP1_grpc.WiFiSettings")
proto.RegisterType((*WiFiState)(nil), "P4wnP1_grpc.WiFiState")
proto.RegisterType((*WiFiBSSCfg)(nil), "P4wnP1_grpc.WiFiBSSCfg")
proto.RegisterType((*StringMessage)(nil), "P4wnP1_grpc.StringMessage")
proto.RegisterType((*StringMessageArray)(nil), "P4wnP1_grpc.StringMessageArray")
proto.RegisterType((*EventRequest)(nil), "P4wnP1_grpc.EventRequest")
proto.RegisterType((*EventValue)(nil), "P4wnP1_grpc.EventValue")
proto.RegisterType((*Event)(nil), "P4wnP1_grpc.Event")
@ -1350,6 +1394,12 @@ type P4WNP1Client interface {
DeployWiFiSettings(ctx context.Context, in *WiFiSettings, opts ...grpc.CallOption) (*WiFiState, error)
GetWiFiState(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*WiFiState, error)
ListenWiFiStateChanges(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*WiFiState, error)
// ToDo: Template requests (store, load, listStored)
StoreWifiSettings(ctx context.Context, in *WifiRequestSettingsStorage, opts ...grpc.CallOption) (*Empty, error)
GetStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*WiFiSettings, error)
DeployStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*WiFiState, error)
StoreDeployedWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*Empty, error)
ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error)
}
type p4WNP1Client struct {
@ -1617,6 +1667,51 @@ func (c *p4WNP1Client) ListenWiFiStateChanges(ctx context.Context, in *Empty, op
return out, nil
}
func (c *p4WNP1Client) StoreWifiSettings(ctx context.Context, in *WifiRequestSettingsStorage, opts ...grpc.CallOption) (*Empty, error) {
out := new(Empty)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/StoreWifiSettings", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *p4WNP1Client) GetStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*WiFiSettings, error) {
out := new(WiFiSettings)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/GetStoredWifiSettingsList", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *p4WNP1Client) DeployStoredWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*WiFiState, error) {
out := new(WiFiState)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/DeployStoredWifiSettings", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *p4WNP1Client) StoreDeployedWifiSettings(ctx context.Context, in *StringMessage, opts ...grpc.CallOption) (*Empty, error) {
out := new(Empty)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/StoreDeployedWifiSettings", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *p4WNP1Client) ListStoredWifiSettings(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMessageArray, error) {
out := new(StringMessageArray)
err := grpc.Invoke(ctx, "/P4wnP1_grpc.P4WNP1/ListStoredWifiSettings", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for P4WNP1 service
type P4WNP1Server interface {
@ -1653,6 +1748,12 @@ type P4WNP1Server interface {
DeployWiFiSettings(context.Context, *WiFiSettings) (*WiFiState, error)
GetWiFiState(context.Context, *Empty) (*WiFiState, error)
ListenWiFiStateChanges(context.Context, *Empty) (*WiFiState, error)
// ToDo: Template requests (store, load, listStored)
StoreWifiSettings(context.Context, *WifiRequestSettingsStorage) (*Empty, error)
GetStoredWifiSettings(context.Context, *StringMessage) (*WiFiSettings, error)
DeployStoredWifiSettings(context.Context, *StringMessage) (*WiFiState, error)
StoreDeployedWifiSettings(context.Context, *StringMessage) (*Empty, error)
ListStoredWifiSettings(context.Context, *Empty) (*StringMessageArray, error)
}
func RegisterP4WNP1Server(s *grpc.Server, srv P4WNP1Server) {
@ -2130,6 +2231,96 @@ func _P4WNP1_ListenWiFiStateChanges_Handler(srv interface{}, ctx context.Context
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_StoreWifiSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(WifiRequestSettingsStorage)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).StoreWifiSettings(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/StoreWifiSettings",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).StoreWifiSettings(ctx, req.(*WifiRequestSettingsStorage))
}
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_GetStoredWifiSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StringMessage)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).GetStoredWifiSettings(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/GetStoredWifiSettingsList",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).GetStoredWifiSettings(ctx, req.(*StringMessage))
}
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_DeployStoredWifiSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StringMessage)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).DeployStoredWifiSettings(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/DeployStoredWifiSettings",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).DeployStoredWifiSettings(ctx, req.(*StringMessage))
}
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_StoreDeployedWifiSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StringMessage)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).StoreDeployedWifiSettings(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/StoreDeployedWifiSettings",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).StoreDeployedWifiSettings(ctx, req.(*StringMessage))
}
return interceptor(ctx, in, info, handler)
}
func _P4WNP1_ListStoredWifiSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Empty)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(P4WNP1Server).ListStoredWifiSettings(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/P4wnP1_grpc.P4WNP1/ListStoredWifiSettings",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(P4WNP1Server).ListStoredWifiSettings(ctx, req.(*Empty))
}
return interceptor(ctx, in, info, handler)
}
var _P4WNP1_serviceDesc = grpc.ServiceDesc{
ServiceName: "P4wnP1_grpc.P4WNP1",
HandlerType: (*P4WNP1Server)(nil),
@ -2234,6 +2425,26 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{
MethodName: "ListenWiFiStateChanges",
Handler: _P4WNP1_ListenWiFiStateChanges_Handler,
},
{
MethodName: "StoreWifiSettings",
Handler: _P4WNP1_StoreWifiSettings_Handler,
},
{
MethodName: "GetStoredWifiSettingsList",
Handler: _P4WNP1_GetStoredWifiSettings_Handler,
},
{
MethodName: "DeployStoredWifiSettings",
Handler: _P4WNP1_DeployStoredWifiSettings_Handler,
},
{
MethodName: "StoreDeployedWifiSettings",
Handler: _P4WNP1_StoreDeployedWifiSettings_Handler,
},
{
MethodName: "ListStoredWifiSettings",
Handler: _P4WNP1_ListStoredWifiSettings_Handler,
},
},
Streams: []grpc.StreamDesc{
{
@ -2248,147 +2459,155 @@ var _P4WNP1_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("grpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 2266 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdd, 0x73, 0xdb, 0xb8,
0x11, 0xd7, 0x87, 0x3f, 0xa4, 0x95, 0x64, 0x31, 0xb8, 0x8b, 0xc3, 0xf8, 0xf2, 0xe1, 0xb0, 0xb9,
0xd4, 0x93, 0xeb, 0xa8, 0x77, 0xa9, 0xe7, 0x7a, 0x93, 0x69, 0x27, 0x27, 0x4b, 0x94, 0xa5, 0xc4,
0xfa, 0x18, 0xd0, 0x8a, 0xa7, 0xed, 0x83, 0x8e, 0x26, 0x61, 0x9b, 0x0d, 0x45, 0xb2, 0x04, 0xa8,
0xc4, 0x7d, 0xb8, 0x87, 0xbe, 0xf7, 0xb9, 0xff, 0x45, 0xff, 0xab, 0xfe, 0x1d, 0xed, 0x00, 0xfc,
0x10, 0x49, 0x4b, 0x76, 0xda, 0xbe, 0x01, 0x8b, 0xc5, 0x0f, 0x8b, 0xdd, 0xc5, 0x2e, 0x76, 0x01,
0x2e, 0x7d, 0xcf, 0x68, 0x79, 0xbe, 0xcb, 0x5c, 0x54, 0x9b, 0x1c, 0x7e, 0x74, 0x26, 0xdf, 0xcd,
0x38, 0x49, 0xf9, 0x47, 0x19, 0xea, 0x67, 0x56, 0xcf, 0xd2, 0x08, 0x63, 0x96, 0x73, 0x49, 0x11,
0x82, 0x0d, 0x47, 0x9f, 0x13, 0xb9, 0xb8, 0x5f, 0x3c, 0xa8, 0x62, 0x31, 0x46, 0x7b, 0x50, 0x31,
0x2d, 0xaa, 0x9f, 0xdb, 0xc4, 0x94, 0x4b, 0xfb, 0xc5, 0x83, 0x0a, 0x4e, 0xe6, 0xe8, 0x09, 0x80,
0x4f, 0x2e, 0x03, 0x5b, 0x67, 0xae, 0x7f, 0x2d, 0x97, 0xc5, 0xae, 0x14, 0x05, 0xbd, 0x81, 0xfa,
0x47, 0xd7, 0xff, 0x60, 0x39, 0x97, 0xb3, 0xb9, 0x6b, 0x12, 0x79, 0x63, 0xbf, 0x78, 0xb0, 0xf3,
0xea, 0x51, 0x2b, 0x25, 0x44, 0x8b, 0x0b, 0x70, 0x16, 0x32, 0x0d, 0x5d, 0x93, 0xe0, 0xda, 0xc7,
0xe5, 0x04, 0x7d, 0x0f, 0x55, 0x3d, 0x60, 0x57, 0xe1, 0xee, 0x4d, 0xb1, 0xfb, 0xe1, 0x8d, 0xdd,
0xed, 0x80, 0x5d, 0x89, 0xad, 0x15, 0x3d, 0x1a, 0x21, 0x19, 0xb6, 0x8d, 0x2b, 0xdd, 0x71, 0x88,
0x2d, 0x6f, 0xed, 0x17, 0x0f, 0x1a, 0x38, 0x9e, 0xa2, 0x16, 0x6c, 0xe9, 0xde, 0xec, 0x48, 0xd3,
0xe4, 0xed, 0xfd, 0xe2, 0x41, 0xed, 0xd5, 0x83, 0x1b, 0x70, 0x47, 0x9a, 0xd6, 0xb9, 0xb8, 0xc4,
0x9b, 0xba, 0x77, 0xa4, 0x69, 0xe8, 0x0d, 0x34, 0x0d, 0xdb, 0x22, 0x0e, 0xe3, 0x7b, 0x66, 0xb6,
0x45, 0x99, 0x5c, 0xd9, 0x2f, 0xdf, 0xb6, 0xb1, 0x11, 0xf2, 0x1f, 0x69, 0xda, 0x89, 0x45, 0x19,
0xfa, 0x0a, 0xaa, 0x57, 0x96, 0x49, 0x66, 0x94, 0x5a, 0xa6, 0x5c, 0x0d, 0x15, 0xc8, 0x09, 0x1a,
0xb5, 0x4c, 0xb4, 0x0b, 0x5b, 0x0e, 0xf9, 0x34, 0x77, 0x1d, 0xb9, 0x21, 0x56, 0xa2, 0x99, 0xf2,
0xcf, 0x22, 0x54, 0x85, 0x65, 0x98, 0xce, 0x08, 0x6a, 0xc1, 0x86, 0x50, 0x40, 0x51, 0x28, 0x60,
0xef, 0xc6, 0xc1, 0x82, 0x4b, 0x68, 0x40, 0xf0, 0xa5, 0x6f, 0x5f, 0xca, 0xde, 0x1e, 0xc1, 0x86,
0x90, 0x23, 0x34, 0x95, 0x18, 0xa3, 0x0e, 0x34, 0x8d, 0xc0, 0xf7, 0x89, 0xc3, 0x62, 0x3f, 0x10,
0x76, 0xaa, 0xad, 0xd0, 0x74, 0xcc, 0x80, 0xf3, 0x3b, 0x94, 0x57, 0x00, 0x4b, 0x15, 0xf0, 0x63,
0x34, 0x6d, 0xd0, 0x8d, 0xfd, 0x88, 0x8f, 0x91, 0x04, 0xe5, 0x89, 0xf6, 0x4e, 0x08, 0x54, 0xc5,
0x7c, 0xa8, 0x3c, 0x83, 0x86, 0xc6, 0x7c, 0x6e, 0x6a, 0x42, 0xa9, 0x7e, 0x49, 0x38, 0xcb, 0x9c,
0x5e, 0x46, 0xbb, 0xf8, 0x50, 0x69, 0x41, 0x5d, 0x5d, 0x10, 0x87, 0x61, 0xf2, 0x97, 0x80, 0x50,
0xc6, 0x1d, 0x8e, 0x9b, 0x80, 0x38, 0xa7, 0xd7, 0x5e, 0xa8, 0x8f, 0x32, 0x4e, 0x51, 0x14, 0x1d,
0x40, 0xf0, 0xbf, 0xd7, 0xed, 0x80, 0xbb, 0xee, 0x36, 0xa3, 0xe2, 0x84, 0x10, 0xb3, 0x5f, 0xc0,
0x31, 0x01, 0xed, 0xc2, 0x26, 0x3b, 0x77, 0xdd, 0x50, 0x43, 0x95, 0x7e, 0x01, 0x87, 0x53, 0x24,
0xc3, 0x16, 0xb3, 0x1c, 0xf6, 0xfd, 0xa1, 0xd0, 0x51, 0xb9, 0x5f, 0xc0, 0xd1, 0xfc, 0x68, 0x13,
0xca, 0x0b, 0xdd, 0x56, 0x4e, 0x60, 0x53, 0x1c, 0xc1, 0x2f, 0xc9, 0x96, 0x52, 0x88, 0x31, 0xfa,
0x35, 0x6c, 0x2d, 0xf8, 0xd1, 0x54, 0x2e, 0xad, 0x70, 0x92, 0xa5, 0x68, 0x38, 0x62, 0x53, 0x7e,
0x82, 0x2f, 0x4f, 0xc9, 0xdc, 0xeb, 0x5a, 0xfe, 0xd8, 0xef, 0x59, 0x36, 0x89, 0x2f, 0x2a, 0x41,
0xd9, 0xb4, 0xfc, 0x58, 0x15, 0xa6, 0xe5, 0x73, 0x57, 0xf1, 0x7c, 0x72, 0x61, 0x7d, 0x8a, 0x54,
0x18, 0xcd, 0xb8, 0x4a, 0x5c, 0xc7, 0xbe, 0xee, 0xb9, 0xb6, 0x49, 0x7c, 0x21, 0x74, 0x05, 0xa7,
0x28, 0xca, 0x6f, 0xe1, 0x7e, 0xee, 0x04, 0xea, 0xb9, 0x0e, 0x25, 0xe1, 0xe3, 0xa5, 0x81, 0xcd,
0x26, 0x3a, 0xbb, 0x8a, 0x4e, 0x4a, 0x51, 0x94, 0x31, 0x34, 0x31, 0xd1, 0xcd, 0xb4, 0x54, 0x08,
0x36, 0xbc, 0x25, 0xb3, 0x18, 0xa3, 0x2f, 0x61, 0x93, 0x32, 0xdd, 0x67, 0x42, 0xac, 0x32, 0x0e,
0x27, 0x9c, 0xd3, 0xd4, 0x99, 0x2e, 0xe4, 0xa9, 0x63, 0x31, 0x56, 0xbe, 0x05, 0x69, 0x09, 0x18,
0x09, 0xf1, 0x08, 0xaa, 0x3e, 0xd1, 0xcd, 0x8e, 0x1b, 0x38, 0x2c, 0xd2, 0xe4, 0x92, 0xa0, 0x2c,
0x40, 0x3a, 0xf3, 0x2d, 0x46, 0xee, 0x92, 0x61, 0x97, 0x3f, 0x6a, 0x8f, 0x38, 0x71, 0x84, 0x8a,
0x66, 0x48, 0x81, 0xfa, 0x3c, 0xa0, 0x6c, 0xe4, 0x32, 0xf5, 0x13, 0x7f, 0xb9, 0xa1, 0x76, 0x32,
0xb4, 0x44, 0xd2, 0x8d, 0x94, 0xa4, 0x5f, 0x43, 0x93, 0x1f, 0x39, 0x70, 0x2e, 0xdc, 0x5b, 0x8e,
0x55, 0x7e, 0x06, 0x69, 0xc9, 0x16, 0x5d, 0x68, 0x55, 0x08, 0xe5, 0xaf, 0xce, 0xfa, 0x2b, 0x89,
0x34, 0x24, 0xc6, 0x9c, 0x26, 0xde, 0x74, 0x59, 0x3c, 0xd0, 0xe4, 0xdd, 0xce, 0x5d, 0xf3, 0xd4,
0x9a, 0x87, 0x91, 0xb2, 0x8c, 0xe3, 0x29, 0x57, 0xb2, 0x45, 0xbb, 0x96, 0x2f, 0x62, 0x60, 0x05,
0x87, 0x13, 0xe5, 0x8f, 0x20, 0xf5, 0x07, 0x5d, 0xcd, 0xf0, 0x2d, 0x2f, 0xfd, 0x42, 0xa8, 0x20,
0xa4, 0xad, 0xba, 0xa4, 0xa0, 0x17, 0xb0, 0xc3, 0xac, 0x39, 0x71, 0x03, 0xa6, 0x11, 0xc3, 0x75,
0x4c, 0x1a, 0x85, 0x88, 0x1c, 0x55, 0x79, 0x02, 0xf5, 0x04, 0xfb, 0xad, 0x7b, 0x8e, 0x76, 0xa0,
0x64, 0x99, 0x02, 0xaf, 0x81, 0x4b, 0x96, 0xa9, 0x3c, 0x4f, 0x9d, 0xfd, 0xd6, 0x3d, 0x17, 0xa1,
0x4e, 0x82, 0xb2, 0x65, 0x52, 0xb9, 0xb8, 0x5f, 0x3e, 0x68, 0x60, 0x3e, 0x54, 0xde, 0x83, 0xdc,
0x1f, 0x74, 0x71, 0xe0, 0x38, 0x96, 0x73, 0xf9, 0xd6, 0x3d, 0x17, 0x91, 0x0a, 0x0b, 0x1f, 0x4b,
0x21, 0x96, 0x39, 0x22, 0xd7, 0xc8, 0x62, 0x3e, 0x30, 0x63, 0x2d, 0xf1, 0x31, 0x37, 0x2c, 0x75,
0x03, 0xdf, 0x20, 0x51, 0xc4, 0x8a, 0x66, 0xca, 0xcf, 0xd0, 0x4c, 0xdd, 0x5c, 0xc0, 0x7d, 0x03,
0xe5, 0x3f, 0xbb, 0xe7, 0x02, 0x2f, 0x1f, 0xba, 0xd2, 0x82, 0x62, 0xce, 0xc5, 0xb5, 0x64, 0xd1,
0x9e, 0xe5, 0x58, 0xf4, 0x2a, 0x49, 0x6b, 0x29, 0xca, 0xf2, 0x6d, 0xbc, 0xa5, 0xae, 0xb3, 0x4c,
0x6c, 0x31, 0x45, 0x69, 0x41, 0xed, 0x44, 0xed, 0x26, 0x79, 0xf3, 0x29, 0xd4, 0xce, 0x6d, 0xcb,
0xf9, 0x30, 0x33, 0x12, 0x3f, 0x6e, 0x60, 0x10, 0xa4, 0xd0, 0x91, 0xff, 0xb5, 0x01, 0x3b, 0xc7,
0xba, 0x79, 0x49, 0x92, 0x88, 0xc9, 0x8d, 0x4d, 0x9c, 0x30, 0xad, 0x16, 0xc5, 0xf9, 0xf1, 0x94,
0xab, 0x71, 0x61, 0x99, 0x71, 0xa4, 0x5c, 0x58, 0x82, 0xe2, 0x25, 0x51, 0x9b, 0x0f, 0x85, 0x67,
0xeb, 0x4e, 0x70, 0xa1, 0x1b, 0x2c, 0xf0, 0x89, 0x2f, 0xfc, 0xa5, 0x8a, 0x33, 0x34, 0x7e, 0x82,
0xe7, 0xbb, 0x66, 0x60, 0x30, 0xe1, 0x36, 0x55, 0x1c, 0x4f, 0x85, 0x5a, 0x89, 0x6f, 0xe9, 0x61,
0x76, 0xe4, 0x6a, 0x15, 0x33, 0xf4, 0x04, 0x6a, 0x01, 0x25, 0xb3, 0x4e, 0xb7, 0x33, 0x53, 0x3b,
0x43, 0x91, 0x21, 0x2b, 0xb8, 0x1a, 0x50, 0xd2, 0xe9, 0x76, 0xd4, 0xce, 0x90, 0xe7, 0x32, 0xbe,
0x8e, 0x47, 0xdd, 0x81, 0x26, 0x57, 0xc2, 0x5c, 0x16, 0x50, 0x22, 0xe6, 0xe8, 0x00, 0x24, 0xbe,
0xd8, 0x1f, 0x74, 0x67, 0xef, 0xd4, 0x3f, 0x1c, 0x8d, 0xdb, 0xb8, 0x1b, 0xe5, 0xbb, 0x9d, 0x80,
0x92, 0xfe, 0xa0, 0x1b, 0x53, 0x91, 0x02, 0x8d, 0x98, 0x73, 0x38, 0x9e, 0x6a, 0xaa, 0x0c, 0x82,
0xad, 0x16, 0xb2, 0x09, 0x52, 0x2c, 0x0a, 0xe7, 0xc1, 0xed, 0x33, 0xb9, 0x96, 0x88, 0xc2, 0xfd,
0xa9, 0x7d, 0x86, 0x1e, 0xc0, 0x36, 0x5f, 0x9f, 0x0e, 0x35, 0xb9, 0x1e, 0xbe, 0xf9, 0x80, 0x92,
0xe9, 0x50, 0x43, 0x8f, 0x01, 0xf8, 0x82, 0xa6, 0xe2, 0x41, 0xfb, 0x24, 0x4a, 0xab, 0x7c, 0x5f,
0x48, 0x40, 0x6f, 0x61, 0xc7, 0x77, 0x4c, 0x8b, 0xce, 0x68, 0x9c, 0xec, 0x76, 0x84, 0xc7, 0xfc,
0x22, 0xe3, 0x31, 0x59, 0x5b, 0xa9, 0xec, 0x8a, 0xf8, 0x0e, 0x61, 0xb8, 0x21, 0xb6, 0x26, 0x26,
0x1c, 0x82, 0x64, 0x98, 0xc6, 0x8c, 0x18, 0xf3, 0x25, 0x5a, 0xf3, 0xf3, 0xd1, 0x76, 0x0c, 0xd3,
0x50, 0x8d, 0x79, 0x02, 0xd7, 0x86, 0x7a, 0x30, 0x4f, 0x09, 0x26, 0x09, 0xa8, 0x27, 0xb7, 0x40,
0x4d, 0x87, 0x1a, 0xae, 0x05, 0xf3, 0x44, 0x22, 0x65, 0x02, 0xbb, 0xab, 0x0f, 0x13, 0xdf, 0x10,
0x97, 0xb2, 0x99, 0x6e, 0x9a, 0x71, 0x5a, 0xa9, 0x70, 0x42, 0xdb, 0x34, 0x7d, 0xf4, 0x10, 0x2a,
0x26, 0x59, 0x84, 0x6b, 0xa1, 0xdb, 0x6d, 0x9b, 0x64, 0xc1, 0x97, 0x94, 0xdf, 0xc3, 0xbd, 0x1b,
0x67, 0xf2, 0x70, 0x64, 0x98, 0xbe, 0x3b, 0x8f, 0x3c, 0x37, 0x9c, 0xf0, 0x07, 0x7c, 0x61, 0xd9,
0x24, 0x42, 0x10, 0x63, 0x65, 0x06, 0xcf, 0xba, 0xc4, 0xb3, 0xdd, 0x6b, 0x62, 0xc6, 0xa2, 0x0c,
0x1c, 0x46, 0xfc, 0x0b, 0xdd, 0x20, 0xc9, 0xc5, 0x5f, 0xc3, 0x86, 0xf8, 0x58, 0x15, 0x45, 0xce,
0x7c, 0x91, 0xcd, 0x99, 0xeb, 0x76, 0x61, 0xb1, 0x47, 0xf9, 0x5b, 0x19, 0x1e, 0xae, 0x47, 0x5e,
0x15, 0x8d, 0xdf, 0x44, 0x91, 0xb7, 0x24, 0x7e, 0x53, 0xdf, 0x7c, 0xde, 0x69, 0xad, 0xd4, 0xf7,
0x8a, 0x07, 0x0f, 0x8f, 0x2b, 0x87, 0x50, 0x7a, 0x18, 0x07, 0x87, 0x25, 0x85, 0xff, 0x98, 0x1d,
0xc2, 0xe6, 0x3a, 0xfd, 0x70, 0x18, 0xbd, 0xcb, 0x64, 0x9e, 0x7e, 0xf5, 0x9b, 0xd9, 0x57, 0x3f,
0x06, 0x64, 0x5e, 0x19, 0x9e, 0x46, 0xfc, 0x05, 0xf1, 0x93, 0x9f, 0xd8, 0x96, 0xf0, 0x81, 0xa7,
0x19, 0x21, 0xbb, 0xfd, 0xce, 0x24, 0xcb, 0x86, 0x57, 0x6c, 0x45, 0xcf, 0xa1, 0x11, 0xbb, 0xd2,
0xc0, 0x99, 0x52, 0x12, 0x3d, 0xe7, 0x2c, 0x51, 0xe9, 0xc0, 0x86, 0xf8, 0x31, 0x03, 0x6c, 0x0d,
0xdb, 0xa3, 0x69, 0xfb, 0x44, 0x2a, 0xa0, 0x26, 0xd4, 0xf8, 0x19, 0xb3, 0xce, 0xc9, 0x40, 0x1d,
0x9d, 0x4a, 0xc5, 0x84, 0xa0, 0xa9, 0xf8, 0xbd, 0x8a, 0xa5, 0x12, 0x6a, 0x40, 0x75, 0x3a, 0x1a,
0xb6, 0x47, 0xed, 0x63, 0xb5, 0x2b, 0x95, 0x95, 0x7f, 0x97, 0x01, 0xdd, 0x94, 0x6a, 0xf9, 0x5b,
0x9b, 0xb8, 0x7e, 0x12, 0x15, 0x97, 0x14, 0x74, 0x00, 0xcd, 0x70, 0x96, 0xa8, 0x3b, 0xf2, 0x9d,
0x3c, 0x99, 0x7f, 0x13, 0x6c, 0xa2, 0x53, 0xf1, 0x11, 0x88, 0x34, 0xbe, 0x24, 0xa0, 0x97, 0x20,
0x39, 0x2e, 0xe3, 0x65, 0x80, 0xeb, 0x5b, 0x4c, 0x67, 0xd6, 0x22, 0x4c, 0xa0, 0x15, 0x7c, 0x83,
0x8e, 0x5a, 0x80, 0x4c, 0x77, 0xe4, 0xb2, 0x23, 0xcb, 0x31, 0x97, 0xc7, 0x86, 0xb6, 0x58, 0xb1,
0xc2, 0xf3, 0xa5, 0xa1, 0xdb, 0xf6, 0xb9, 0x6e, 0x7c, 0x08, 0x73, 0x48, 0x14, 0x32, 0x73, 0x54,
0x74, 0x08, 0x5b, 0xbe, 0xee, 0x5c, 0x12, 0x2a, 0x6f, 0x0b, 0x2f, 0x7e, 0xb4, 0xc6, 0x64, 0x98,
0x33, 0xe1, 0x88, 0x17, 0xf5, 0x60, 0xdb, 0xf5, 0x98, 0xe5, 0x3a, 0x34, 0xaa, 0x2a, 0x7e, 0x75,
0x87, 0xa5, 0x5b, 0xe3, 0x90, 0x5d, 0x75, 0x98, 0x7f, 0x8d, 0xe3, 0xcd, 0xa8, 0x03, 0x35, 0xca,
0x2f, 0x68, 0xf4, 0x5d, 0xca, 0xa8, 0x5c, 0x15, 0x58, 0xcf, 0xd6, 0x61, 0x25, 0x9c, 0x38, 0xbd,
0x6b, 0xef, 0x35, 0xd4, 0xd3, 0xe8, 0x3c, 0xeb, 0x7c, 0x20, 0xd7, 0x91, 0xdd, 0xf8, 0x90, 0xbf,
0x7b, 0xf1, 0x6f, 0x8d, 0xcc, 0x14, 0x4e, 0x5e, 0x97, 0x7e, 0x28, 0x2a, 0x2e, 0x34, 0x73, 0x77,
0x14, 0x39, 0x94, 0x0f, 0x4e, 0xdc, 0x8f, 0xc4, 0x4f, 0xfe, 0x97, 0x09, 0x25, 0x59, 0x9f, 0x7a,
0x1e, 0x89, 0xc3, 0x4e, 0x8a, 0x92, 0xd8, 0x5c, 0xfc, 0x87, 0xd2, 0x36, 0xe7, 0x04, 0xe5, 0x07,
0xf8, 0x72, 0xd5, 0x8d, 0x44, 0x0d, 0xa1, 0x1b, 0x49, 0x0d, 0xa1, 0x1b, 0xe2, 0x9f, 0xe1, 0x45,
0xf8, 0x25, 0xcb, 0x53, 0xb6, 0x61, 0x53, 0x9d, 0x7b, 0xec, 0xfa, 0x65, 0x17, 0x9a, 0xb9, 0xe2,
0x13, 0xd5, 0x60, 0x7b, 0x3a, 0x7a, 0x37, 0x1a, 0x9f, 0x8d, 0xa4, 0x02, 0xda, 0x82, 0x52, 0x7b,
0x22, 0x15, 0xd1, 0x36, 0x94, 0xb5, 0xd3, 0xb6, 0x54, 0x42, 0x5f, 0x40, 0x53, 0x3b, 0x6d, 0xcf,
0x7a, 0xed, 0xc1, 0xc9, 0xf8, 0xbd, 0x8a, 0x67, 0xed, 0x89, 0x54, 0x7e, 0xd9, 0x85, 0x46, 0xa6,
0x06, 0x43, 0xf7, 0xe1, 0x1e, 0xe7, 0x1a, 0x8d, 0x4f, 0x67, 0x9d, 0xf1, 0x68, 0xa4, 0x76, 0x4e,
0xd5, 0xae, 0x54, 0x40, 0x55, 0xd8, 0x6c, 0x4f, 0x66, 0x53, 0x0e, 0x78, 0x0f, 0x1a, 0x9c, 0x63,
0xb9, 0x5a, 0x7a, 0xf9, 0x22, 0xac, 0xc4, 0xe3, 0x52, 0x16, 0xd5, 0xa1, 0x72, 0x36, 0x69, 0xbf,
0x9a, 0x4d, 0xb4, 0x77, 0x52, 0x01, 0x55, 0x60, 0x63, 0x3c, 0x51, 0x47, 0x52, 0xf1, 0xd5, 0xdf,
0x25, 0xd8, 0x9a, 0x1c, 0x9e, 0x8d, 0x26, 0xdf, 0xa1, 0x21, 0xc8, 0xc7, 0x84, 0xc5, 0xd1, 0x35,
0x13, 0xa4, 0x11, 0xca, 0x46, 0x35, 0x7e, 0xdd, 0xbd, 0xaf, 0x6e, 0x49, 0x24, 0x4a, 0x01, 0xf5,
0xe1, 0x8b, 0x10, 0xeb, 0xff, 0x46, 0xea, 0xc1, 0xbd, 0x63, 0xc2, 0x72, 0xdf, 0x9d, 0xff, 0x01,
0x67, 0x0c, 0xf7, 0xb4, 0x1b, 0x38, 0xb7, 0xed, 0xb9, 0x0b, 0xf0, 0x47, 0xd8, 0x39, 0x26, 0x2c,
0xfd, 0x71, 0x5b, 0x25, 0x95, 0x9c, 0xa1, 0xa5, 0xb8, 0x43, 0x04, 0x2d, 0x8b, 0xb0, 0x96, 0x7b,
0x6f, 0x05, 0xb6, 0x52, 0x40, 0x5d, 0xa8, 0x0f, 0xf9, 0x97, 0x70, 0x3a, 0xd4, 0x44, 0xec, 0xba,
0x23, 0xbd, 0xaf, 0x41, 0x99, 0xc1, 0xd3, 0xd0, 0x58, 0xeb, 0x53, 0xdf, 0x67, 0xa6, 0xd1, 0x35,
0x07, 0xb8, 0xf0, 0xcb, 0x63, 0xc2, 0xda, 0xb6, 0x7d, 0x77, 0xf6, 0x5e, 0xa5, 0xc3, 0x56, 0x36,
0xf4, 0xdc, 0x85, 0xa1, 0x14, 0x90, 0x0d, 0xcf, 0x53, 0xde, 0xbc, 0xfe, 0xb4, 0x6c, 0xf7, 0x23,
0xd3, 0x3f, 0xd8, 0xfb, 0xcc, 0x2b, 0x2b, 0x05, 0x34, 0x14, 0xd5, 0x0d, 0x0e, 0x9c, 0x28, 0x7a,
0x3f, 0x5e, 0x5d, 0x2f, 0x44, 0x45, 0xd5, 0xde, 0xa3, 0x75, 0xcb, 0xbc, 0x20, 0x10, 0x70, 0xcd,
0x34, 0x1c, 0xaf, 0x97, 0xee, 0x40, 0x5c, 0x5f, 0xa0, 0x28, 0x05, 0x84, 0xe1, 0x7e, 0x7f, 0xd0,
0x3d, 0x26, 0x6c, 0x59, 0xb5, 0x84, 0x35, 0xce, 0xfa, 0x5d, 0x77, 0x8a, 0xa8, 0x02, 0xea, 0x0f,
0xba, 0x1d, 0xdd, 0x31, 0x88, 0xbd, 0x94, 0xf2, 0x16, 0xc0, 0xd5, 0x7e, 0x31, 0x82, 0x07, 0xa1,
0x68, 0x51, 0x4d, 0x97, 0xf0, 0xaf, 0xf6, 0x83, 0xc7, 0x6b, 0xf1, 0x79, 0xc1, 0xa8, 0x14, 0xd0,
0x11, 0xec, 0x26, 0x62, 0xb5, 0x6d, 0xfb, 0x0e, 0xb8, 0xd5, 0x32, 0xfd, 0x29, 0x56, 0x57, 0xae,
0xce, 0xbc, 0xed, 0x76, 0x5f, 0xe7, 0x97, 0x56, 0xd6, 0xa8, 0x42, 0xc0, 0x5a, 0x4f, 0x4b, 0x9a,
0x10, 0x39, 0xb3, 0xe6, 0x9b, 0x13, 0x6b, 0x04, 0x7c, 0x07, 0xd0, 0xd3, 0xe2, 0xd6, 0x07, 0xca,
0x5a, 0x2a, 0xd7, 0x62, 0xc9, 0x69, 0x2c, 0xdf, 0x2f, 0x11, 0x16, 0x68, 0xf4, 0xb4, 0x63, 0xc2,
0xe2, 0xce, 0x43, 0x0e, 0x2f, 0xd7, 0xb7, 0xc8, 0xe1, 0xe5, 0xdb, 0x15, 0x4a, 0x01, 0xfd, 0x04,
0xf7, 0x7b, 0x5a, 0xc7, 0x27, 0x3a, 0x23, 0x99, 0x3e, 0x11, 0xca, 0x7e, 0x1f, 0x56, 0x75, 0xa9,
0xf6, 0x94, 0xdb, 0x58, 0x92, 0x13, 0x7e, 0x84, 0x9a, 0xe8, 0x7c, 0x9d, 0x88, 0x4f, 0x5d, 0xce,
0x2a, 0xe9, 0xf6, 0x5e, 0x5e, 0x7d, 0x7c, 0x49, 0x29, 0x7c, 0x5b, 0x44, 0xc7, 0x50, 0x53, 0x8d,
0xab, 0xa4, 0x17, 0x73, 0x5b, 0x0c, 0xb8, 0x65, 0x4d, 0x29, 0xa0, 0x01, 0xa0, 0x30, 0xc4, 0x64,
0xda, 0xde, 0xeb, 0x1b, 0x9d, 0x7b, 0xbb, 0xab, 0x9b, 0xad, 0x4a, 0x01, 0xfd, 0x0e, 0xea, 0xc7,
0x84, 0x2d, 0x9b, 0xb4, 0xab, 0xfc, 0x75, 0xfd, 0xee, 0x1e, 0xec, 0x86, 0xea, 0x48, 0x88, 0x9d,
0xab, 0xf0, 0x4b, 0xf8, 0x5f, 0xe1, 0x9c, 0x6f, 0x89, 0xb6, 0xfe, 0x6f, 0xfe, 0x13, 0x00, 0x00,
0xff, 0xff, 0x5b, 0x33, 0x09, 0x0d, 0xe4, 0x17, 0x00, 0x00,
// 2396 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5b, 0x77, 0xdb, 0xb8,
0xf1, 0x97, 0x2c, 0x5f, 0xa4, 0x91, 0x64, 0xd1, 0xd8, 0x8d, 0xa3, 0x78, 0x73, 0x71, 0xf8, 0xcf,
0x66, 0x7d, 0xb2, 0xff, 0xe3, 0x66, 0x53, 0x77, 0xbb, 0x27, 0xa7, 0x3d, 0x59, 0x59, 0x17, 0x4b,
0x89, 0x75, 0x39, 0xa0, 0x1d, 0x9f, 0xb6, 0x0f, 0x5a, 0x9a, 0x84, 0x6d, 0x34, 0x14, 0xc9, 0x12,
0xa0, 0x13, 0xf7, 0x61, 0x1f, 0xfa, 0x25, 0xfa, 0x09, 0xfa, 0xda, 0x6f, 0xd5, 0xcf, 0xd1, 0x1e,
0x80, 0x77, 0x5a, 0x92, 0xb3, 0xed, 0x1b, 0x30, 0x1c, 0xfc, 0x66, 0x30, 0x33, 0x98, 0x19, 0x80,
0x00, 0x97, 0x9e, 0x6b, 0xec, 0xbb, 0x9e, 0xc3, 0x1d, 0x54, 0x9d, 0x1c, 0x7c, 0xb4, 0x27, 0xdf,
0x4d, 0x05, 0x49, 0xfd, 0x08, 0x3b, 0x67, 0xf4, 0x82, 0x62, 0xf2, 0x17, 0x9f, 0x30, 0xae, 0x11,
0xce, 0xa9, 0x7d, 0xc9, 0x34, 0xee, 0x78, 0xfa, 0x25, 0x41, 0x2a, 0xd4, 0x4e, 0xc8, 0xcc, 0xb5,
0x74, 0x4e, 0x46, 0xfa, 0x8c, 0x34, 0x8b, 0xbb, 0xc5, 0xbd, 0x0a, 0xce, 0xd0, 0xd0, 0x6f, 0xa0,
0xcc, 0xc2, 0x65, 0xcd, 0x95, 0xdd, 0xe2, 0x5e, 0xf5, 0xd5, 0x83, 0xfd, 0x94, 0x84, 0xfd, 0x33,
0xda, 0xa3, 0x11, 0x2e, 0x8e, 0x59, 0xd5, 0xbf, 0x97, 0xa0, 0x96, 0xfe, 0x84, 0x10, 0xac, 0xda,
0x89, 0x0c, 0x39, 0x46, 0x3b, 0x50, 0x36, 0x29, 0xd3, 0xcf, 0x2d, 0x62, 0x4a, 0xec, 0x32, 0x8e,
0xe7, 0xe8, 0x31, 0x80, 0x47, 0x2e, 0x7d, 0x4b, 0xe7, 0x8e, 0x77, 0xd3, 0x2c, 0xc9, 0x55, 0x29,
0x0a, 0x7a, 0x03, 0xb5, 0x8f, 0x8e, 0xf7, 0x81, 0xda, 0x97, 0xd3, 0x99, 0x63, 0x92, 0xe6, 0xea,
0x6e, 0x71, 0x6f, 0xf3, 0xd5, 0xc3, 0x5b, 0xba, 0x9d, 0x05, 0x4c, 0x43, 0xc7, 0x24, 0xb8, 0xfa,
0x31, 0x99, 0xa0, 0xef, 0xa1, 0xa2, 0xfb, 0xfc, 0x2a, 0x58, 0xbd, 0x26, 0x57, 0xdf, 0xde, 0x59,
0xcb, 0xe7, 0x57, 0x72, 0x69, 0x59, 0x0f, 0x47, 0xa8, 0x09, 0x1b, 0xc6, 0x95, 0x6e, 0xdb, 0xc4,
0x6a, 0xae, 0xef, 0x16, 0xf7, 0xea, 0x38, 0x9a, 0xa2, 0x7d, 0x58, 0xd7, 0xdd, 0xe9, 0xa1, 0xa6,
0x35, 0x37, 0xa4, 0xa1, 0xee, 0xdf, 0x82, 0x3b, 0xd4, 0xb4, 0xf6, 0xc5, 0x25, 0x5e, 0xd3, 0xdd,
0x43, 0x4d, 0x43, 0x6f, 0xa0, 0x61, 0x58, 0x94, 0xd8, 0x5c, 0xac, 0x99, 0x5a, 0x94, 0xf1, 0x66,
0x79, 0xb7, 0xb4, 0x6c, 0x61, 0x3d, 0xe0, 0x3f, 0xd4, 0xb4, 0x63, 0xca, 0x38, 0xfa, 0x0a, 0x2a,
0x57, 0xd4, 0x24, 0x53, 0xc6, 0xa8, 0xd9, 0xac, 0x04, 0x06, 0x14, 0x04, 0x8d, 0x51, 0x13, 0x6d,
0xc3, 0xba, 0x4d, 0x3e, 0xcd, 0x1c, 0xbb, 0x59, 0x97, 0x5f, 0xc2, 0x99, 0xfa, 0xcf, 0x22, 0x54,
0xa4, 0x67, 0xb8, 0xce, 0x09, 0xda, 0x87, 0x55, 0x69, 0x80, 0xa2, 0x34, 0xc0, 0xce, 0x6d, 0xd7,
0x0a, 0x2e, 0x69, 0x01, 0xc9, 0x97, 0xde, 0xfd, 0x4a, 0x76, 0xf7, 0x08, 0x56, 0xa5, 0x1e, 0x81,
0xab, 0xe4, 0x18, 0xb5, 0xa1, 0x61, 0xf8, 0x9e, 0x47, 0xec, 0x38, 0xf4, 0xa4, 0x9f, 0x96, 0xc6,
0x50, 0x7e, 0x85, 0xfa, 0x0a, 0x20, 0x31, 0x81, 0x10, 0xa3, 0x69, 0x83, 0x4e, 0x14, 0x47, 0x62,
0x8c, 0x14, 0x28, 0x4d, 0xb4, 0x77, 0x52, 0xa1, 0x0a, 0x16, 0x43, 0xf5, 0x29, 0xd4, 0x35, 0xee,
0x09, 0x57, 0x13, 0xc6, 0x44, 0xa8, 0x2b, 0x50, 0x9a, 0xb1, 0xcb, 0x70, 0x95, 0x18, 0xaa, 0x2f,
0x01, 0x65, 0x58, 0x5a, 0x9e, 0xa7, 0xdf, 0x88, 0x90, 0x9c, 0xb1, 0x4b, 0x39, 0x6e, 0x16, 0x77,
0x4b, 0x7b, 0x15, 0x1c, 0xcf, 0xd5, 0x7d, 0xa8, 0x75, 0xaf, 0x89, 0xcd, 0xc3, 0xd3, 0x24, 0x42,
0x54, 0x38, 0x8d, 0xd8, 0x27, 0x37, 0x6e, 0x60, 0xc1, 0x12, 0x4e, 0x51, 0x54, 0x1d, 0x40, 0xf2,
0xbf, 0xd7, 0x2d, 0x5f, 0x04, 0xfb, 0x06, 0x67, 0x52, 0x60, 0xa0, 0x45, 0xbf, 0x80, 0x23, 0x02,
0xda, 0x86, 0x35, 0x7e, 0xee, 0x38, 0x81, 0x4d, 0xcb, 0xfd, 0x02, 0x0e, 0xa6, 0xa8, 0x09, 0xeb,
0x9c, 0xda, 0xfc, 0xfb, 0x03, 0x69, 0xd5, 0x52, 0xbf, 0x80, 0xc3, 0xf9, 0xe1, 0x1a, 0x94, 0xae,
0x75, 0x4b, 0x3d, 0x86, 0x35, 0x29, 0x42, 0x98, 0x85, 0x27, 0x5a, 0xc8, 0x31, 0xfa, 0x15, 0xac,
0x5f, 0x0b, 0xd1, 0xe2, 0xe0, 0xde, 0x0e, 0xab, 0x44, 0x35, 0x1c, 0xb2, 0xa9, 0x3f, 0xc1, 0x97,
0xe2, 0xec, 0x77, 0xa8, 0x37, 0xf6, 0x7a, 0xd4, 0x22, 0xd1, 0x46, 0x15, 0x28, 0x99, 0xd4, 0x8b,
0x8c, 0x67, 0x52, 0x4f, 0x04, 0x97, 0xeb, 0x91, 0x0b, 0xfa, 0x29, 0x34, 0x7a, 0x38, 0x13, 0x26,
0x71, 0x6c, 0xeb, 0xa6, 0xe7, 0x58, 0x26, 0xf1, 0xa4, 0xd2, 0x65, 0x9c, 0xa2, 0xa8, 0xbf, 0x85,
0x7b, 0x39, 0x09, 0xcc, 0x75, 0x6c, 0x46, 0x82, 0xe3, 0xce, 0x7c, 0x8b, 0x4f, 0x74, 0x7e, 0x15,
0x4a, 0x4a, 0x51, 0xd4, 0x31, 0x34, 0x30, 0xd1, 0xcd, 0xb4, 0x56, 0x08, 0x56, 0xdd, 0x84, 0x59,
0x8e, 0xd1, 0x97, 0xb0, 0xc6, 0xb8, 0xee, 0x71, 0xa9, 0x56, 0x09, 0x07, 0x13, 0xc1, 0x69, 0xea,
0x5c, 0x97, 0xfa, 0xd4, 0xb0, 0x1c, 0xab, 0x2f, 0x41, 0x49, 0x00, 0x43, 0x25, 0x1e, 0x42, 0xc5,
0x23, 0xba, 0xd9, 0x76, 0x7c, 0x9b, 0x87, 0x96, 0x4c, 0x08, 0xea, 0x35, 0x28, 0x67, 0x1e, 0xe5,
0xe4, 0x2e, 0x1d, 0xb6, 0x45, 0x1a, 0x70, 0x89, 0x1d, 0xe5, 0xb4, 0x70, 0x26, 0xb2, 0xed, 0xcc,
0x67, 0x7c, 0xe4, 0xf0, 0xee, 0x27, 0x71, 0xd6, 0x03, 0xeb, 0x64, 0x68, 0xb1, 0xa6, 0xab, 0x29,
0x4d, 0xbf, 0x86, 0x86, 0x10, 0x39, 0xb0, 0x2f, 0x9c, 0x25, 0x62, 0xd5, 0x9f, 0x41, 0x49, 0xd8,
0xc2, 0x0d, 0xcd, 0x4b, 0xba, 0xe2, 0x9c, 0xd2, 0xbf, 0x92, 0xd0, 0x42, 0x72, 0x2c, 0x68, 0x32,
0x0b, 0x94, 0xe4, 0x91, 0x8e, 0x4f, 0xfa, 0xcc, 0x31, 0x4f, 0xe8, 0x2c, 0xc8, 0xad, 0x25, 0x1c,
0x4d, 0x85, 0x91, 0x29, 0xeb, 0x50, 0x4f, 0x66, 0xcd, 0x32, 0x0e, 0x26, 0xea, 0x1f, 0x41, 0xe9,
0x0f, 0x3a, 0x9a, 0xe1, 0x51, 0x37, 0x7d, 0x42, 0x98, 0x24, 0xa4, 0xbd, 0x9a, 0x50, 0xd0, 0x73,
0xd8, 0xe4, 0x74, 0x46, 0x1c, 0x9f, 0x6b, 0xc4, 0x70, 0x6c, 0x93, 0x85, 0x49, 0x25, 0x47, 0x55,
0x1f, 0x43, 0x2d, 0xc6, 0x7e, 0xeb, 0x9c, 0xa3, 0x4d, 0x58, 0xa1, 0xa6, 0xc4, 0xab, 0xe3, 0x15,
0x6a, 0xaa, 0xcf, 0x52, 0xb2, 0xdf, 0x3a, 0xe7, 0x32, 0x39, 0x2a, 0x50, 0xa2, 0x26, 0x93, 0x87,
0xb8, 0x8e, 0xc5, 0x50, 0x7d, 0x0f, 0xcd, 0xfe, 0xa0, 0x83, 0x7d, 0xdb, 0xa6, 0xf6, 0xe5, 0x5b,
0xe7, 0x5c, 0xe6, 0x36, 0x2c, 0x63, 0x2c, 0x85, 0x58, 0x12, 0x88, 0xc2, 0x22, 0xd7, 0xb3, 0x81,
0x19, 0x59, 0x49, 0x8c, 0x85, 0x63, 0x99, 0xe3, 0x7b, 0x06, 0x09, 0x73, 0x5c, 0x38, 0x53, 0x7f,
0x86, 0x46, 0x6a, 0xe7, 0x12, 0xee, 0x5b, 0x28, 0xfd, 0xd9, 0x39, 0x97, 0x78, 0xf9, 0x64, 0x97,
0x56, 0x14, 0x0b, 0x2e, 0x61, 0x25, 0xca, 0x7a, 0xd4, 0xa6, 0xec, 0x2a, 0x2e, 0x84, 0x29, 0x4a,
0x72, 0x36, 0xde, 0x32, 0xc7, 0x4e, 0x4a, 0x61, 0x44, 0x51, 0xf7, 0xa1, 0x7a, 0xdc, 0xed, 0xc4,
0x95, 0xf6, 0x09, 0x54, 0xcf, 0x2d, 0x6a, 0x7f, 0x98, 0x1a, 0x71, 0x1c, 0xd7, 0x31, 0x48, 0x52,
0x10, 0xc8, 0xff, 0x5a, 0x85, 0xcd, 0x23, 0xdd, 0xbc, 0x24, 0x71, 0x8e, 0x15, 0xce, 0x26, 0x76,
0x50, 0x88, 0x8b, 0x52, 0x7e, 0x34, 0x15, 0x66, 0xbc, 0xa6, 0x66, 0x94, 0x5b, 0xaf, 0xa9, 0xa4,
0xb8, 0x71, 0x9e, 0x17, 0x43, 0x19, 0xd9, 0xba, 0xed, 0x5f, 0xe8, 0x06, 0xf7, 0x3d, 0xe2, 0xc9,
0x78, 0xa9, 0xe0, 0x0c, 0x4d, 0x48, 0x70, 0x3d, 0xc7, 0xf4, 0x0d, 0x2e, 0xc3, 0xa6, 0x82, 0xa3,
0xa9, 0x34, 0x2b, 0xf1, 0xa8, 0x1e, 0xd4, 0x53, 0x61, 0x56, 0x39, 0x43, 0x8f, 0xa1, 0xea, 0x33,
0x32, 0x6d, 0x77, 0xda, 0xd3, 0x6e, 0x7b, 0x28, 0x6b, 0x6a, 0x19, 0x57, 0x7c, 0x46, 0xda, 0x9d,
0x76, 0xb7, 0x3d, 0x14, 0xd5, 0x4f, 0x7c, 0xc7, 0xa3, 0xce, 0x40, 0x6b, 0x96, 0x83, 0xea, 0xe7,
0x33, 0x22, 0xe7, 0x68, 0x0f, 0x14, 0xf1, 0xb1, 0x3f, 0xe8, 0x4c, 0xdf, 0x75, 0xff, 0x70, 0x38,
0x6e, 0xe1, 0x4e, 0x58, 0x21, 0x37, 0x7d, 0x46, 0xfa, 0x83, 0x4e, 0x44, 0x45, 0x2a, 0xd4, 0x23,
0xce, 0xe1, 0xf8, 0x54, 0xeb, 0x36, 0x41, 0xb2, 0x55, 0x03, 0x36, 0x49, 0x8a, 0x54, 0x11, 0x3c,
0xb8, 0x75, 0xd6, 0xac, 0xc6, 0xaa, 0x88, 0x78, 0x6a, 0x9d, 0xa1, 0xfb, 0xb0, 0x21, 0xbe, 0x9f,
0x0e, 0xb5, 0x66, 0x2d, 0x38, 0xf3, 0x3e, 0x23, 0xa7, 0x43, 0x0d, 0x3d, 0x02, 0x10, 0x1f, 0xb4,
0x2e, 0x1e, 0xb4, 0x8e, 0xc3, 0x42, 0x2c, 0xd6, 0x05, 0x04, 0xf4, 0x16, 0x36, 0x3d, 0xdb, 0xa4,
0x6c, 0x1a, 0xb7, 0x58, 0x9b, 0x32, 0x62, 0xfe, 0x2f, 0x13, 0x31, 0x59, 0x5f, 0x75, 0xf9, 0x15,
0xf1, 0x6c, 0xc2, 0x71, 0x5d, 0x2e, 0x8d, 0x5d, 0x38, 0x04, 0xc5, 0x30, 0x8d, 0x29, 0x31, 0x66,
0x09, 0x5a, 0xe3, 0xf3, 0xd1, 0x36, 0x0d, 0xd3, 0xe8, 0x1a, 0xb3, 0x18, 0xae, 0x05, 0x35, 0x7f,
0x96, 0x52, 0x4c, 0x91, 0x50, 0x8f, 0x97, 0x40, 0x9d, 0x0e, 0x35, 0x5c, 0xf5, 0x67, 0xb1, 0x46,
0xea, 0x04, 0xb6, 0xe7, 0x0b, 0x93, 0x8d, 0x8b, 0xc3, 0xf8, 0x54, 0x37, 0xcd, 0xa8, 0xac, 0x94,
0x05, 0xa1, 0x65, 0x9a, 0x1e, 0x7a, 0x00, 0x65, 0x93, 0x5c, 0x07, 0xdf, 0x82, 0xb0, 0xdb, 0x30,
0xc9, 0xb5, 0xf8, 0xa4, 0xfe, 0x1e, 0xb6, 0x6e, 0xc9, 0x14, 0xe9, 0xc8, 0x30, 0x3d, 0x67, 0x16,
0x46, 0x6e, 0x30, 0x11, 0x07, 0xf8, 0x82, 0x5a, 0x24, 0x44, 0x90, 0x63, 0x75, 0x0a, 0x4f, 0x3b,
0xc4, 0xb5, 0x9c, 0x1b, 0x62, 0x46, 0xaa, 0x0c, 0x6c, 0x4e, 0xbc, 0x0b, 0xdd, 0x20, 0xf1, 0xc6,
0x5f, 0xc3, 0xaa, 0x6c, 0xc5, 0x8a, 0xb2, 0x66, 0x3e, 0xcf, 0xd6, 0xcc, 0x45, 0xab, 0xb0, 0x5c,
0xa3, 0xfe, 0xad, 0x04, 0x0f, 0x16, 0x23, 0xcf, 0xcb, 0xc6, 0x6f, 0xc2, 0xcc, 0xbb, 0x22, 0xfb,
0xaf, 0x6f, 0x3f, 0x4f, 0xda, 0x7e, 0xaa, 0x21, 0x13, 0xc9, 0xc3, 0x15, 0xc6, 0x21, 0x8c, 0x1d,
0x44, 0xc9, 0x21, 0xa1, 0x88, 0x86, 0xc6, 0x26, 0x7c, 0xa6, 0xb3, 0x0f, 0x07, 0xe1, 0xb9, 0x8c,
0xe7, 0xe9, 0x53, 0xbf, 0x96, 0x3d, 0xf5, 0x63, 0x40, 0xe6, 0x95, 0xe1, 0x6a, 0xc4, 0xbb, 0x26,
0x5e, 0xdc, 0xbb, 0xad, 0xcb, 0x18, 0x78, 0x92, 0x51, 0xb2, 0xd3, 0x6f, 0x4f, 0xb2, 0x6c, 0x78,
0xce, 0x52, 0xf4, 0x0c, 0xea, 0x51, 0x28, 0x0d, 0xec, 0x53, 0x46, 0xc2, 0xe3, 0x9c, 0x25, 0xaa,
0x6d, 0x58, 0x95, 0x3d, 0x36, 0xc0, 0xfa, 0xb0, 0x35, 0x3a, 0x6d, 0x1d, 0x2b, 0x05, 0xd4, 0x80,
0xaa, 0x90, 0x31, 0x6d, 0x1f, 0x0f, 0xba, 0xa3, 0x13, 0xa5, 0x18, 0x13, 0xb4, 0x2e, 0x7e, 0xdf,
0xc5, 0xca, 0x0a, 0xaa, 0x43, 0xe5, 0x74, 0x34, 0x6c, 0x8d, 0x5a, 0x47, 0xdd, 0x8e, 0x52, 0x52,
0xff, 0x5d, 0x02, 0x74, 0x5b, 0xab, 0xa4, 0x5b, 0x9b, 0x38, 0x5e, 0x9c, 0x15, 0x13, 0x0a, 0xda,
0x83, 0x46, 0x30, 0x8b, 0xcd, 0x1d, 0xc6, 0x4e, 0x9e, 0x2c, 0xda, 0x04, 0x8b, 0xe8, 0x4c, 0x36,
0x02, 0xa1, 0xc5, 0x13, 0x02, 0x7a, 0x01, 0x8a, 0xed, 0x70, 0x71, 0x71, 0x70, 0x3c, 0xca, 0x75,
0x4e, 0xaf, 0x83, 0x02, 0x5a, 0xc6, 0xb7, 0xe8, 0x68, 0x1f, 0x90, 0xe9, 0x8c, 0x1c, 0x7e, 0x48,
0x6d, 0x33, 0x11, 0x1b, 0xf8, 0x62, 0xce, 0x17, 0x51, 0x2f, 0x0d, 0xdd, 0xb2, 0xce, 0x75, 0xe3,
0x43, 0x50, 0x43, 0xc2, 0x94, 0x99, 0xa3, 0xa2, 0x03, 0x58, 0xf7, 0x74, 0xfb, 0x92, 0xb0, 0xe6,
0x86, 0x8c, 0xe2, 0x87, 0x0b, 0x5c, 0x86, 0x05, 0x13, 0x0e, 0x79, 0x51, 0x0f, 0x36, 0x1c, 0x97,
0x53, 0xc7, 0x66, 0xe1, 0x3d, 0xe4, 0xff, 0xef, 0xf0, 0xf4, 0xfe, 0x38, 0x60, 0xef, 0xda, 0xdc,
0xbb, 0xc1, 0xd1, 0x62, 0xd4, 0x86, 0x2a, 0x13, 0x1b, 0x34, 0xfa, 0x0e, 0xe3, 0xac, 0x59, 0x91,
0x58, 0x4f, 0x17, 0x61, 0xc5, 0x9c, 0x38, 0xbd, 0x6a, 0xe7, 0x35, 0xd4, 0xd2, 0xe8, 0xa2, 0xea,
0x7c, 0x20, 0x37, 0xa1, 0xdf, 0xc4, 0x50, 0x9c, 0x7b, 0xd9, 0xb7, 0x86, 0x6e, 0x0a, 0x26, 0xaf,
0x57, 0x7e, 0x28, 0xaa, 0x0e, 0x34, 0x72, 0x7b, 0x94, 0x35, 0x54, 0x0c, 0x8e, 0x9d, 0x8f, 0xc4,
0x8b, 0xfb, 0xcb, 0x98, 0x12, 0x7f, 0x3f, 0x75, 0x5d, 0x12, 0xa5, 0x9d, 0x14, 0x25, 0xf6, 0xb9,
0xec, 0x87, 0xd2, 0x3e, 0x17, 0x04, 0xf5, 0x07, 0xf8, 0x72, 0xde, 0x8e, 0xe4, 0xad, 0x43, 0x37,
0xe2, 0x5b, 0x87, 0x6e, 0xc8, 0x3e, 0xc3, 0x0d, 0xf1, 0x57, 0xa8, 0xab, 0x6e, 0xc0, 0x5a, 0x77,
0xe6, 0xf2, 0x9b, 0x17, 0x1d, 0x68, 0xe4, 0xae, 0xab, 0xa8, 0x0a, 0x1b, 0xa7, 0xa3, 0x77, 0xa3,
0xf1, 0xd9, 0x48, 0x29, 0xa0, 0x75, 0x58, 0x69, 0x4d, 0x94, 0x22, 0xda, 0x80, 0x92, 0x76, 0xd2,
0x52, 0x56, 0xd0, 0x17, 0xd0, 0xd0, 0x4e, 0x5a, 0xd3, 0x5e, 0x6b, 0x70, 0x3c, 0x7e, 0xdf, 0xc5,
0xd3, 0xd6, 0x44, 0x29, 0xbd, 0xe8, 0x40, 0x3d, 0x73, 0x6b, 0x43, 0xf7, 0x60, 0x4b, 0x70, 0x8d,
0xc6, 0x27, 0xd3, 0xf6, 0x78, 0x34, 0xea, 0xb6, 0x4f, 0xba, 0x1d, 0xa5, 0x80, 0x2a, 0xb0, 0xd6,
0x9a, 0x4c, 0x4f, 0x05, 0xe0, 0x16, 0xd4, 0x05, 0x47, 0xf2, 0x75, 0xe5, 0xc5, 0xf3, 0xe0, 0xee,
0x1e, 0x5d, 0x7e, 0x51, 0x0d, 0xca, 0x67, 0x93, 0xd6, 0xab, 0xe9, 0x44, 0x7b, 0xa7, 0x14, 0x50,
0x19, 0x56, 0xc7, 0x93, 0xee, 0x48, 0x29, 0xbe, 0xfa, 0xc7, 0x17, 0xb0, 0x3e, 0x39, 0x38, 0x1b,
0x4d, 0xbe, 0x43, 0x43, 0x68, 0x1e, 0x11, 0x1e, 0x65, 0xd7, 0x4c, 0x92, 0x46, 0x28, 0x9b, 0xd5,
0xc4, 0x76, 0x77, 0xbe, 0x5a, 0x52, 0x48, 0xd4, 0x02, 0xea, 0xc3, 0x17, 0x01, 0xd6, 0xff, 0x8c,
0xd4, 0x83, 0xad, 0x23, 0xc2, 0x73, 0xed, 0xce, 0x7f, 0x81, 0x33, 0x86, 0x2d, 0xed, 0x16, 0xce,
0xb2, 0x35, 0x77, 0x01, 0xfe, 0x08, 0x9b, 0x47, 0x84, 0xa7, 0x1b, 0xb7, 0x79, 0x5a, 0x35, 0x33,
0xb4, 0x14, 0x77, 0x80, 0xa0, 0x65, 0x11, 0x16, 0x72, 0xef, 0xcc, 0xc1, 0x56, 0x0b, 0xa8, 0x03,
0xb5, 0xa1, 0x68, 0x09, 0x4f, 0x87, 0x9a, 0xcc, 0x5d, 0x77, 0x94, 0xf7, 0x05, 0x28, 0x53, 0x78,
0x12, 0x38, 0x6b, 0x71, 0xe9, 0xfb, 0xcc, 0x32, 0xba, 0x40, 0x80, 0x03, 0xdf, 0x1c, 0x11, 0xde,
0xb2, 0xac, 0xbb, 0xab, 0xf7, 0x3c, 0x1b, 0xee, 0x67, 0x53, 0xcf, 0x5d, 0x18, 0x6a, 0x01, 0x59,
0xf0, 0x2c, 0x15, 0xcd, 0x8b, 0xa5, 0x65, 0xdf, 0x4b, 0x32, 0xcf, 0x09, 0x3b, 0x9f, 0xb9, 0x65,
0xb5, 0x80, 0x86, 0xf2, 0x76, 0x83, 0x7d, 0x3b, 0xcc, 0xde, 0x8f, 0xe6, 0xdf, 0x17, 0xc2, 0x4b,
0xd5, 0xce, 0xc3, 0x45, 0x9f, 0xc5, 0x85, 0x40, 0xc2, 0x35, 0xd2, 0x70, 0xe2, 0xbe, 0x74, 0x07,
0xe2, 0xe2, 0x0b, 0x8a, 0x5a, 0x40, 0x18, 0xee, 0xf5, 0x07, 0x9d, 0x23, 0xc2, 0x93, 0x5b, 0x4b,
0x70, 0xc7, 0x59, 0xbc, 0xea, 0x4e, 0x15, 0xbb, 0x80, 0xfa, 0x83, 0x4e, 0x5b, 0xb7, 0x0d, 0x62,
0x25, 0x5a, 0x2e, 0x01, 0x9c, 0x1f, 0x17, 0x23, 0xb8, 0x1f, 0xa8, 0x16, 0xde, 0xe9, 0x62, 0xfe,
0xf9, 0x71, 0xf0, 0x68, 0x21, 0xbe, 0xb8, 0x30, 0xaa, 0x05, 0x74, 0x08, 0xdb, 0xb1, 0x5a, 0x2d,
0xcb, 0xba, 0x03, 0x6e, 0xbe, 0x4e, 0x7f, 0x8a, 0xcc, 0x95, 0xbb, 0x67, 0x2e, 0xdb, 0xdd, 0xd7,
0xf9, 0x4f, 0x73, 0xef, 0xa8, 0x52, 0xc1, 0x6a, 0x4f, 0x8b, 0x1f, 0x21, 0x72, 0x6e, 0xcd, 0x3f,
0x4e, 0x2c, 0x50, 0xf0, 0x1d, 0x40, 0x4f, 0x8b, 0x9e, 0x3e, 0x50, 0xd6, 0x53, 0xb9, 0x27, 0x96,
0x9c, 0xc5, 0xf2, 0xef, 0x25, 0xd2, 0x03, 0xf5, 0x9e, 0x76, 0x44, 0x78, 0xf4, 0xf2, 0x90, 0xc3,
0xcb, 0xbd, 0x5b, 0xe4, 0xf0, 0xf2, 0xcf, 0x15, 0x6a, 0x01, 0xfd, 0x04, 0xf7, 0x7a, 0x5a, 0xdb,
0x23, 0x3a, 0x27, 0x99, 0x77, 0x22, 0x94, 0x6d, 0x1f, 0xe6, 0xbd, 0x52, 0xed, 0xa8, 0xcb, 0x58,
0x62, 0x09, 0x3f, 0x42, 0x55, 0xbe, 0x7c, 0x1d, 0xcb, 0xa6, 0x2e, 0xe7, 0x95, 0xf4, 0xf3, 0x5e,
0xde, 0x7c, 0xe2, 0x93, 0x5a, 0x78, 0x59, 0x44, 0x47, 0x50, 0xed, 0x1a, 0x57, 0xf1, 0x5b, 0xcc,
0xb2, 0x1c, 0xb0, 0xe4, 0x9b, 0x5a, 0x40, 0x03, 0x40, 0x41, 0x8a, 0xc9, 0x3c, 0x94, 0x2f, 0x7e,
0x1a, 0xdd, 0xd9, 0x9e, 0xff, 0x3c, 0xab, 0x16, 0xd0, 0xef, 0xa0, 0x76, 0x44, 0x78, 0xf2, 0xac,
0x3b, 0x2f, 0x5e, 0x17, 0xaf, 0xee, 0xc1, 0x76, 0x60, 0x8e, 0x98, 0xd8, 0xbe, 0x0a, 0x5a, 0xc2,
0x5f, 0x86, 0x83, 0x61, 0x4b, 0xe3, 0x8e, 0x47, 0xce, 0xe8, 0x45, 0xb2, 0x9f, 0x6f, 0x72, 0xec,
0x8b, 0xfe, 0x46, 0x2c, 0x08, 0xd7, 0x09, 0xdc, 0x13, 0xb9, 0x47, 0xc0, 0x9a, 0x19, 0xdc, 0x65,
0x76, 0x5f, 0x6c, 0x43, 0x89, 0xd8, 0x0c, 0xcc, 0xfe, 0x0b, 0x41, 0x17, 0xef, 0x7b, 0x08, 0x0f,
0x24, 0x56, 0x54, 0x30, 0x3e, 0x1b, 0x72, 0xfe, 0x96, 0xc7, 0x81, 0x3b, 0xe6, 0xa8, 0x37, 0xcf,
0x1d, 0x4f, 0x16, 0xe3, 0x07, 0xcf, 0xd6, 0x85, 0xf3, 0x75, 0xf9, 0x67, 0xe8, 0xd7, 0xff, 0x09,
0x00, 0x00, 0xff, 0xff, 0x79, 0x64, 0x7f, 0x9a, 0x27, 0x1a, 0x00, 0x00,
}

View File

@ -43,8 +43,17 @@ service P4WNP1 {
rpc GetWiFiState (Empty) returns (WiFiState) {}
rpc ListenWiFiStateChanges (Empty) returns (WiFiState) {}
// ToDo: Template requests (store, load, listStored)
rpc StoreWifiSettings(WifiRequestSettingsStorage) returns (Empty) {}
rpc GetStoredWifiSettings(StringMessage) returns (WiFiSettings) {}
rpc DeployStoredWifiSettings(StringMessage) returns (WiFiState) {}
rpc StoreDeployedWifiSettings(StringMessage) returns (Empty) {}
rpc ListStoredWifiSettings(Empty) returns (StringMessageArray) {}
}
message WifiRequestSettingsStorage {
string TemplateName = 1;
WiFiSettings settings = 2;
}
/* WiFi2 (distinguish state and settings) */
enum WiFiWorkingMode {
@ -95,13 +104,15 @@ message WiFiBSSCfg {
string PSK = 2;
}
/* Alive check */
message StringMessage {
string msg = 1;
}
message StringMessageArray {
repeated string msgArray = 1;
}
/* Events */
message EventRequest {
int64 listenType = 1;

View File

@ -4,6 +4,7 @@ import (
"errors"
"github.com/dgraph-io/badger"
_ "github.com/dgraph-io/badger"
"strings"
)
/*
@ -14,8 +15,10 @@ var (
ErrCreate = errors.New("Error creating store")
ErrOpen = errors.New("Error opening store")
ErrGet = errors.New("Error retrieving value from store")
ErrKeys = errors.New("Error retrieving keys from store")
ErrDelete = errors.New("Error deleting value from store")
ErrPut = errors.New("Error putting value into store")
ErrExists = errors.New("Error key exists already")
)
@ -42,6 +45,11 @@ func (s *Store) Close() {
}
func (s *Store) Put(key string, value interface{}, allowOverwrite bool) (err error) {
// ToDo: Remove race condition (existence check and value set have to be merged into a single transaction)
if !allowOverwrite && s.Exists(key) {
return ErrExists
}
// serialize value
sv,err := s.serializer.Encode(value)
if err != nil { return }
@ -54,6 +62,19 @@ func (s *Store) Put(key string, value interface{}, allowOverwrite bool) (err err
return
}
func (s *Store) Exists(key string) (exists bool) {
bkey := []byte(key)
err := s.Db.View(func(txn *badger.Txn) error {
_, err := txn.Get(bkey)
if err != nil {
return ErrGet
}
return nil
})
if err != nil { return false }
return true
}
func (s *Store) Get(key string, target interface{}) (err error) {
err = s.Db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(key))
@ -72,10 +93,41 @@ func (s *Store) Get(key string, target interface{}) (err error) {
return
}
func (s *Store) Keys() (keys []string, err error) {
err = s.Db.View(func(txn *badger.Txn) error {
iter := txn.NewIterator(badger.DefaultIteratorOptions)
defer iter.Close()
for iter.Rewind(); iter.Valid(); iter.Next() {
keys = append(keys, string(iter.Item().Key()))
}
return nil
})
if err != nil { return keys, ErrKeys }
return
}
func (s *Store) KeysPrefix(prefix string, trimPrefix bool) (keys []string, err error) {
bprefix := []byte(prefix)
err = s.Db.View(func(txn *badger.Txn) error {
iter := txn.NewIterator(badger.DefaultIteratorOptions)
defer iter.Close()
for iter.Seek(bprefix); iter.ValidForPrefix(bprefix); iter.Next() {
if trimPrefix {
s := strings.TrimPrefix(string(iter.Item().Key()), prefix)
keys = append(keys,s)
} else {
keys = append(keys, string(iter.Item().Key()))
}
}
return nil
})
if err != nil { return keys, ErrKeys }
return
}
func (s *Store) Delete(key string) (err error) {
err = s.Db.Update(func(txn *badger.Txn) error {
// Your code here…
return nil
return txn.Delete([]byte(key))
})
if err != nil { return ErrDelete }
return

View File

@ -3,33 +3,70 @@
package service
import (
"log"
pb "github.com/mame82/P4wnP1_go/proto"
"context"
"net"
"golang.org/x/net/context"
"google.golang.org/grpc"
// "google.golang.org/grpc/reflection"
"log"
"net"
"encoding/json"
"errors"
"fmt"
"github.com/improbable-eng/grpc-web/go/grpcweb"
"net/http"
"strings"
"path"
"strings"
"time"
"github.com/mame82/P4wnP1_go/common"
"os"
"io/ioutil"
"os"
)
var (
rpcErrNoHid = errors.New("HIDScript engine disabled, as current USB configuration has mouse and keyboard disable")
)
const (
cSTORE_PREFIX_WIFI_SETTINGS = "ws_"
)
type server struct {}
func (s *server) StoreDeployedWifiSettings(ctx context.Context, m *pb.StringMessage) (e *pb.Empty, err error) {
return s.StoreWifiSettings(ctx, &pb.WifiRequestSettingsStorage{
Settings: ServiceState.WifiSvc.State.CurrentSettings,
TemplateName: m.Msg,
})
}
func (s *server) DeployStoredWifiSettings(ctx context.Context, m *pb.StringMessage) (st *pb.WiFiState, err error) {
ws,err := s.GetStoredWifiSettings(ctx,m)
if err != nil { return st,err }
return s.DeployWiFiSettings(ctx, ws)
}
func (s *server) StoreWifiSettings(ctx context.Context, r *pb.WifiRequestSettingsStorage) (e *pb.Empty, err error) {
e = &pb.Empty{}
err = ServiceState.Store.Put(cSTORE_PREFIX_WIFI_SETTINGS + r.TemplateName, r.Settings, true)
return
}
func (s *server) GetStoredWifiSettings(ctx context.Context, m *pb.StringMessage) (ws *pb.WiFiSettings, err error) {
ws = &pb.WiFiSettings{}
err = ServiceState.Store.Get(cSTORE_PREFIX_WIFI_SETTINGS + m.Msg, ws)
return
}
func (s *server) ListStoredWifiSettings(ctx context.Context, e *pb.Empty) (sa *pb.StringMessageArray, err error) {
res,err := ServiceState.Store.KeysPrefix(cSTORE_PREFIX_WIFI_SETTINGS, true)
if err != nil { return sa,err }
sa = &pb.StringMessageArray{
MsgArray: res,
}
return
}
func (s *server) DeployWiFiSettings(ctx context.Context, wset *pb.WiFiSettings) (wstate *pb.WiFiState, err error) {
return ServiceState.WifiSvc.DeploySettings(wset)
}

View File

@ -5,25 +5,32 @@ package service
import (
"errors"
pb "github.com/mame82/P4wnP1_go/proto"
"github.com/mame82/P4wnP1_go/service/datastore"
)
const (
cSTORE_PATH = "/tmp/P4wnP1_store"
)
var ServiceState *GlobalServiceState
type GlobalServiceState struct {
Store *datastore.Store
EvMgr *EventManager
UsbGM *UsbGadgetManager
Led *LedState
HidDevPath map[string]string //stores device path for HID devices
StoredNetworkSettings map[string]*pb.EthernetInterfaceSettings
// Wifi *WifiState
WifiSvc *WiFiService
BtSvc *BtService
WifiSvc *WiFiService
BtSvc *BtService
}
func InitGlobalServiceState() (err error) {
state := &GlobalServiceState{}
ServiceState = state // store state in global variable
state.Store,err = datastore.Open(cSTORE_PATH)
if err != nil { return }
state.StoredNetworkSettings = make(map[string]*pb.EthernetInterfaceSettings)
/*
@ -32,49 +39,51 @@ func InitGlobalServiceState() (err error) {
*/
//pre initialize Default settings for "wlan0" and USB_ETHERNET_BRIDGE_NAME ("usbeth")
state.StoredNetworkSettings[USB_ETHERNET_BRIDGE_NAME] = &pb.EthernetInterfaceSettings{
Name: USB_ETHERNET_BRIDGE_NAME,
Enabled: false,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.16.0.1",
Netmask4: "255.255.255.252",
Name: USB_ETHERNET_BRIDGE_NAME,
Enabled: false,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.16.0.1",
Netmask4: "255.255.255.252",
}
state.StoredNetworkSettings["wlan0"] = &pb.EthernetInterfaceSettings{
Name: "wlan0",
Enabled: false,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.24.0.1",
Netmask4: "255.255.255.0",
Name: "wlan0",
Enabled: false,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.24.0.1",
Netmask4: "255.255.255.0",
}
state.StoredNetworkSettings[BT_ETHERNET_BRIDGE_NAME] = &pb.EthernetInterfaceSettings{
Name: BT_ETHERNET_BRIDGE_NAME,
Enabled: true,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.26.0.1",
Netmask4: "255.255.255.0",
Name: BT_ETHERNET_BRIDGE_NAME,
Enabled: true,
Mode: pb.EthernetInterfaceSettings_MANUAL,
IpAddress4: "172.26.0.1",
Netmask4: "255.255.255.0",
}
state.WifiSvc = NewWifiService()
state.HidDevPath = make(map[string]string) //should be initialized BEFORE UsbGadgetManager uses it
state.HidDevPath = make(map[string]string) //should be initialized BEFORE UsbGadgetManager uses it
state.EvMgr = NewEventManager(20)
state.UsbGM,err = NewUSBGadgetManager()
if err != nil { return }
state.UsbGM, err = NewUSBGadgetManager()
if err != nil {
return
}
state.BtSvc = NewBtService()
ledState, err := NewLed(false)
if err != nil { return }
if err != nil {
return
}
state.Led = ledState
return nil
}
func (state *GlobalServiceState) GetInterfaceSettingsByInterfaceName(ifname string) (*pb.EthernetInterfaceSettings,error) {
for _,s := range state.StoredNetworkSettings {
func (state *GlobalServiceState) GetInterfaceSettingsByInterfaceName(ifname string) (*pb.EthernetInterfaceSettings, error) {
for _, s := range state.StoredNetworkSettings {
if s.Name == ifname {
return s,nil
return s, nil
}
}
return nil, errors.New("No settings for interface " + ifname + " found")
@ -88,4 +97,4 @@ func (state *GlobalServiceState) StartService() {
func (state *GlobalServiceState) StopService() {
state.EvMgr.Stop()
}
}

View File

@ -845,7 +845,7 @@ func (wsvc WiFiService) UpdateStateFromIw() (err error) {
*/
output := string(res)
output := string(res)
//split into BSS sections
reSsid := regexp.MustCompile("(?m)ssid (.*)\n")

View File

@ -3,15 +3,27 @@
package main
import (
"github.com/mame82/hvue"
"github.com/gopherjs/gopherjs/js"
pb "github.com/mame82/P4wnP1_go/proto/gopherjs"
"github.com/mame82/hvue"
)
func InitComponentsWiFi() {
hvue.NewComponent(
"wifi",
hvue.Template(templateWiFi),
hvue.DataFunc(func(vm *hvue.VM) interface{} {
data := struct {
*js.Object
ShowStoreModal bool `js:"showStoreModal"`
ShowLoadModal bool `js:"showLoadModal"`
TemplateName string `js:"templateName"`
}{Object: O()}
data.ShowStoreModal = false
data.ShowLoadModal = false
data.TemplateName = ""
return &data
}),
hvue.Computed("settings", func(vm *hvue.VM) interface{} {
return vm.Get("$store").Get("state").Get("wifiState").Get("CurrentSettings")
}),
@ -38,11 +50,15 @@ func InitComponentsWiFi() {
switch mode {
case int(pb.WiFiStateMode_STA_CONNECTED):
res := "Connected to network"
if len(ssid) > 0 { res += ": '" + ssid + "' on channel " + channel}
if len(ssid) > 0 {
res += ": '" + ssid + "' on channel " + channel
}
return res
case int(pb.WiFiStateMode_AP_UP):
res := "Access Point running on channel " + channel
if len(ssid) > 0 { res += ": '" + ssid + "'"}
if len(ssid) > 0 {
res += ": '" + ssid + "'"
}
return res
default:
return "Not connected"
@ -67,12 +83,12 @@ func InitComponentsWiFi() {
hvue.Computed("wifiAuthModes", func(vm *hvue.VM) interface{} {
modes := js.Global.Get("Array").New()
for val,_ := range pb.WiFiAuthMode_name {
for val, _ := range pb.WiFiAuthMode_name {
mode := struct {
*js.Object
Label string `js:"label"`
Value int `js:"value"`
}{Object:O()}
Value int `js:"value"`
}{Object: O()}
mode.Value = val
switch pb.WiFiAuthMode(val) {
case pb.WiFiAuthMode_WPA2_PSK:
@ -88,12 +104,12 @@ func InitComponentsWiFi() {
}),
hvue.Computed("wifiModes", func(vm *hvue.VM) interface{} {
modes := js.Global.Get("Array").New()
for val,_ := range pb.WiFiWorkingMode_name {
for val, _ := range pb.WiFiWorkingMode_name {
mode := struct {
*js.Object
Label string `js:"label"`
Value int `js:"value"`
}{Object:O()}
Value int `js:"value"`
}{Object: O()}
mode.Value = val
switch pb.WiFiWorkingMode(val) {
case pb.WiFiWorkingMode_AP:
@ -109,9 +125,9 @@ func InitComponentsWiFi() {
}
return modes
}),
hvue.Computed("mode_ap", func(vm *hvue.VM) interface{} {return pb.WiFiWorkingMode_AP}),
hvue.Computed("mode_sta", func(vm *hvue.VM) interface{} {return pb.WiFiWorkingMode_STA}),
hvue.Computed("mode_failover", func(vm *hvue.VM) interface{} {return pb.WiFiWorkingMode_STA_FAILOVER_AP}),
hvue.Computed("mode_ap", func(vm *hvue.VM) interface{} { return pb.WiFiWorkingMode_AP }),
hvue.Computed("mode_sta", func(vm *hvue.VM) interface{} { return pb.WiFiWorkingMode_STA }),
hvue.Computed("mode_failover", func(vm *hvue.VM) interface{} { return pb.WiFiWorkingMode_STA_FAILOVER_AP }),
hvue.Method("reset",
func(vm *hvue.VM) {
vm.Get("$store").Call("dispatch", VUEX_ACTION_UPDATE_WIFI_STATE)
@ -120,17 +136,93 @@ func InitComponentsWiFi() {
func(vm *hvue.VM, wifiSettings *jsWiFiSettings) {
vm.Get("$store").Call("dispatch", VUEX_ACTION_DEPLOY_WIFI_SETTINGS, wifiSettings)
}),
hvue.Method("updateStoredSettingsList",
func(vm *hvue.VM) {
vm.Store.Call("dispatch", VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST)
}),
hvue.Method("store",
func(vm *hvue.VM) {
sReq := NewWifiRequestSettingsStorage()
sReq.TemplateName = vm.Get("templateName").String()
sReq.Settings = &jsWiFiSettings{
Object: vm.Get("$store").Get("state").Get("wifiState").Get("CurrentSettings"),
}
println("Storing :", sReq)
vm.Get("$store").Call("dispatch", VUEX_ACTION_STORE_WIFI_SETTINGS, sReq)
vm.Set("showStoreModal", false)
}),
hvue.Computed("deploying",
func(vm *hvue.VM) interface{} {
return vm.Get("$store").Get("state").Get("deployingWifiSettings")
}),
hvue.Mounted(func(vm *hvue.VM) {
vm.Store.Call("dispatch", VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST)
}),
)
}
const templateWiFi = `
<q-page padding>
<div class="row gutter-sm">
<q-modal v-model="showLoadModal">
<q-modal-layout>
<q-toolbar slot="header">
<q-toolbar-title>
Load WiFi settings
</q-toolbar-title>
</q-toolbar>
<q-list>
<q-item link tag="label" v-for="tname in this.$store.state.StoredWifiSettingsList" :key="tname">
<q-item-side>
<q-radio v-model="templateName" :val="tname"/>
</q-item-side>
<q-item-main>
<q-item-tile label>{{ tname }}</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile>
<q-btn color="secondary" v-close-overlay label="close" />
<q-btn color="primary" label="load" />
<q-btn color="primary" label="deploy" />
</q-item-tile>
</q-item-main>
</q-item>
</q-list>
</q-modal-layout>
</q-modal>
<q-modal v-model="showStoreModal">
<q-modal-layout>
<q-toolbar slot="header">
<q-toolbar-title>
Store current WiFi Settings
</q-toolbar-title>
</q-toolbar>
<q-list>
<q-item tag="label">
<q-item-main>
<q-item-tile label>Template name</q-item-tile>
<q-item-tile>
<q-input v-model="templateName" inverted></q-input>
</q-item-tile>
</q-item-main>
</q-item>
<q-item tag="label">
<q-item-main>
<q-item-tile>
<q-btn color="secondary" v-close-overlay label="close" />
<q-btn color="primary" @click="store" label="store" />
</q-item-tile>
</q-item-main>
</q-item>
</q-list>
</q-modal-layout>
</q-modal>
<div class="col-lg-4">
<q-card class="full-height">
<q-card-title>
@ -147,6 +239,8 @@ const templateWiFi = `
<q-card-actions>
<q-btn :loading="deploying" color="primary" @click="deploy(settings)" label="deploy"></q-btn>
<q-btn color="secondary" @click="reset" label="reset"></q-btn>
<q-btn color="primary" @click="updateStoredSettingsList(); showStoreModal=true" label="store"></q-btn>
<q-btn color="primary" @click="updateStoredSettingsList(); showLoadModal=true" label="load"></q-btn>
</q-card-actions>
<q-list link>
@ -300,4 +394,4 @@ const templateWiFi = `
</div>
</q-page>
`
`

View File

@ -14,6 +14,32 @@ import (
var eNoLogEvent = errors.New("No log event")
var eNoHidEvent = errors.New("No HID event")
type jsWifiRequestSettingsStorage struct {
*js.Object
TemplateName string `js:"TemplateName"`
Settings *jsWiFiSettings `js:"Settings"`
}
func (rs *jsWifiRequestSettingsStorage) toGo() *pb.WifiRequestSettingsStorage {
return &pb.WifiRequestSettingsStorage{
Settings: rs.Settings.toGo(),
TemplateName: rs.TemplateName,
}
}
func (rs *jsWifiRequestSettingsStorage) fromGo(src *pb.WifiRequestSettingsStorage) {
rs.TemplateName = src.TemplateName
rs.Settings = NewWifiSettings()
rs.Settings.fromGo(src.Settings)
}
func NewWifiRequestSettingsStorage() *jsWifiRequestSettingsStorage {
res := &jsWifiRequestSettingsStorage{Object:O()}
res.TemplateName = ""
res.Settings = NewWifiSettings()
return res
}
/* USB Gadget types corresponding to gRPC messages */
type jsGadgetSettings struct {

View File

@ -102,7 +102,7 @@ func main() {
Store(store), //include Vuex store in global scope, using own hvue fork, see here: https://github.com/HuckRidgeSW/hvue/pull/6
Router(router),
)
// ToDo: remove next line, debug code
// ToDo: remove next lines, debug code
js.Global.Set("vm",vm)
js.Global.Set("rpc", RpcClient)
}

View File

@ -4,8 +4,9 @@ package main
import (
"github.com/gopherjs/gopherjs/js"
"time"
"github.com/mame82/hvue"
"github.com/mame82/mvuex"
"time"
)
var globalState *GlobalState
@ -20,9 +21,14 @@ const (
VUEX_ACTION_UPDATE_WIFI_STATE = "updateCurrentWifiSettingsFromDeployed"
VUEX_ACTION_DEPLOY_WIFI_SETTINGS = "deployWifiSettings"
VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST = "updateStoredWifiSettingsList"
VUEX_ACTION_STORE_WIFI_SETTINGS = "storeWifiSettings"
VUEX_ACTION_LOAD_WIFI_SETTINGS = "storeWifiSettings"
VUEX_MUTATION_SET_CURRENT_GADGET_SETTINGS_TO = "setCurrentGadgetSettings"
VUEX_MUTATION_SET_WIFI_STATE = "setCurrentWifiSettings"
VUEX_MUTATION_SET_CURRENT_HID_SCRIPT_SOURCE_TO = "setCurrentHIDScriptSource"
VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST = "setStoredWifiSettingsList"
initHIDScript = `layout('us'); // US keyboard layout
typingSpeed(100,150) // Wait 100ms between key strokes + an additional random value between 0ms and 150ms (natural)
@ -64,7 +70,9 @@ type GlobalState struct {
FailedConnectionAttempts int `js:"failedConnectionAttempts"`
InterfaceSettings *jsEthernetSettingsList `js:"InterfaceSettings"`
//WiFiSettings *jsWiFiSettings `js:"wifiSettings"`
WiFiState *jsWiFiState `js:"wifiState"`
WiFiState *jsWiFiState `js:"wifiState"`
StoredWifiSettingsList []string `js:"StoredWifiSettingsList"`
}
func createGlobalStateStruct() GlobalState {
@ -78,6 +86,8 @@ func createGlobalStateStruct() GlobalState {
state.IsConnected = false
state.IsModalEnabled = false
state.FailedConnectionAttempts = 0
state.StoredWifiSettingsList = []string{}
//Retrieve Interface settings
// ToDo: Replace panics by default values
ifSettings, err := RpcClient.GetAllDeployedEthernetInterfaceSettings(time.Second * 5)
@ -132,13 +142,43 @@ func actionUpdateWifiState(store *mvuex.Store, context *mvuex.ActionContext, sta
return
}
func actionUpdateStoredWifiSettingsList(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState) {
go func() {
println("Trying to fetch wsList")
//fetch deployed gadget settings
wsList, err := RpcClient.GetStoredWifiSettingsList(time.Second * 10)
if err != nil {
println("Couldn't retrieve WifiSettingsList")
return
}
//commit to current
println(wsList)
context.Commit(VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST, wsList)
//context.Commit(VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST, []string{"test1", "test2"})
}()
return
}
func actionStoreWifiSettings(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState, req *jsWifiRequestSettingsStorage) {
go func() {
println("Vuex dispatch store WiFi settings: ", req.TemplateName)
// convert to Go type
err := RpcClient.StoreWifiSettings(time.Second*30, req.toGo())
if err != nil {
QuasarNotifyError("Error storing WiFi Settings", err.Error(), QUASAR_NOTIFICATION_POSITION_BOTTOM)
}
QuasarNotifySuccess("New WiFi settings stored", "", QUASAR_NOTIFICATION_POSITION_TOP)
}()
}
func actionDeployWifiSettings(store *mvuex.Store, context *mvuex.ActionContext, state *GlobalState, settings *jsWiFiSettings) {
go func() {
state.CurrentlyDeployingWifiSettings = true
defer func() { state.CurrentlyDeployingWifiSettings = false }()
println("Vuex dispatch deploy WiFi settings")
// convert to Go type
goSettings := settings.toGo()
@ -147,7 +187,7 @@ func actionDeployWifiSettings(store *mvuex.Store, context *mvuex.ActionContext,
if err != nil {
QuasarNotifyError("Error deploying WiFi Settings", err.Error(), QUASAR_NOTIFICATION_POSITION_BOTTOM)
}
QuasarNotifySuccess("New WiFi settings deployed","", QUASAR_NOTIFICATION_POSITION_TOP)
QuasarNotifySuccess("New WiFi settings deployed", "", QUASAR_NOTIFICATION_POSITION_TOP)
state.WiFiState.fromGo(wstate)
}()
}
@ -239,6 +279,10 @@ func initMVuex() *mvuex.Store {
state.WiFiState = wifiState
return
}),
mvuex.Mutation(VUEX_MUTATION_SET_STORED_WIFI_SETTINGS_LIST, func(store *mvuex.Store, state *GlobalState, wsList []interface{}) {
println("New ws list", wsList)
hvue.Set(state, "StoredWifiSettingsList", wsList)
}),
/*
mvuex.Mutation("startLogListening", func (store *mvuex.Store, state *GlobalState) {
state.EventReceiver.StartListening()
@ -255,6 +299,8 @@ func initMVuex() *mvuex.Store {
mvuex.Action(VUEX_ACTION_DEPLOY_ETHERNET_INTERFACE_SETTINGS, actionDeployEthernetInterfaceSettings),
mvuex.Action(VUEX_ACTION_UPDATE_WIFI_STATE, actionUpdateWifiState),
mvuex.Action(VUEX_ACTION_DEPLOY_WIFI_SETTINGS, actionDeployWifiSettings),
mvuex.Action(VUEX_ACTION_UPDATE_STORED_WIFI_SETTINGS_LIST, actionUpdateStoredWifiSettingsList),
mvuex.Action(VUEX_ACTION_STORE_WIFI_SETTINGS, actionStoreWifiSettings),
mvuex.Getter("hidjobs", func(state *GlobalState) interface{} {
return state.HidJobList.Jobs
@ -287,6 +333,21 @@ func initMVuex() *mvuex.Store {
return filtered
}),
mvuex.Getter("storedWifiSettingsSelect", func(state *GlobalState) interface{} {
selectWS := js.Global.Get("Array").New()
for _,curS := range state.StoredWifiSettingsList {
option := struct {
*js.Object
Label string `js:"label"`
Value string `js:"value"`
}{Object: O()}
option.Label = curS
option.Value = curS
selectWS.Call("push", option)
}
return selectWS
}),
)

View File

@ -6,42 +6,69 @@ import "github.com/gopherjs/gopherjs/js"
var GlobalQuasar = QuasarGetQuasar()
type QuasarDialogPosition string
const (
QUASAR_NOTIFICATION_TYPE_POSITIVE = "positive"
QUASAR_NOTIFICATION_TYPE_NEGATIVE = "negative"
QUASAR_NOTIFICATION_TYPE_WARNING = "warning"
QUASAR_NOTIFICATION_TYPE_INFO = "info"
QUASAR_NOTIFICATION_TYPE_WARNING = "warning"
QUASAR_NOTIFICATION_TYPE_INFO = "info"
QUASAR_NOTIFICATION_POSITION_TOP = "top"
QUASAR_NOTIFICATION_POSITION_TOP_LEFT = "top-left"
QUASAR_NOTIFICATION_POSITION_TOP_RIGHT = "top-right"
QUASAR_NOTIFICATION_POSITION_LEFT = "left"
QUASAR_NOTIFICATION_POSITION_CENTER = "center"
QUASAR_NOTIFICATION_POSITION_RIGHT = "right"
QUASAR_NOTIFICATION_POSITION_BOTTOM = "bottom"
QUASAR_NOTIFICATION_POSITION_BOTTOM_LEFT = "bottom-left"
QUASAR_NOTIFICATION_POSITION_TOP = "top"
QUASAR_NOTIFICATION_POSITION_TOP_LEFT = "top-left"
QUASAR_NOTIFICATION_POSITION_TOP_RIGHT = "top-right"
QUASAR_NOTIFICATION_POSITION_LEFT = "left"
QUASAR_NOTIFICATION_POSITION_CENTER = "center"
QUASAR_NOTIFICATION_POSITION_RIGHT = "right"
QUASAR_NOTIFICATION_POSITION_BOTTOM = "bottom"
QUASAR_NOTIFICATION_POSITION_BOTTOM_LEFT = "bottom-left"
QUASAR_NOTIFICATION_POSITION_BOTTOM_RIGHT = "bottom-right"
QUASAR_DIALOG_POSITION_TOP = QuasarDialogPosition("top")
QUASAR_DIALOG_POSITION_LEFT = QuasarDialogPosition("left")
QUASAR_DIALOG_POSITION_RIGHT = QuasarDialogPosition("right")
QUASAR_DIALOG_POSITION_BOTTOM = QuasarDialogPosition("bottom")
QUASAR_NOTIFICATION_TIMEOUT = 5000
)
type Quasar struct {
*js.Object
Version string `js:"version"`
Theme string `js:"theme"`
Version string `js:"version"`
Theme string `js:"theme"`
Plugins map[string]*js.Object `js:"plugins"`
}
type QuasarNotification struct {
*js.Object
Message string `js:"message"`
Detail string `js:"detail"`
Type string `js:"type"`
Color string `js:"color"`
Message string `js:"message"`
Detail string `js:"detail"`
Type string `js:"type"`
Color string `js:"color"`
TextColor string `js:"textColor"`
Icon string `js:"icon"`
Position string `js:"position"`
Timeout uint `js:"timeout"`
Icon string `js:"icon"`
Position string `js:"position"`
Timeout uint `js:"timeout"`
}
type QuasarDialogType struct {
*js.Object
Title string `js:"title"`
Message string `js:"message"`
Ok bool `js:"ok"`
Cancel bool `js:"cancel"`
PreventClose bool `js:"preventClose"`
NoBackdropDismiss bool `js:"noBackdropDismiss"`
NoEscDismiss bool `js:"noEscDismiss"`
StackButtons bool `js:"stackButtons"`
Position QuasarDialogPosition `js:"position"`
Detail string `js:"detail"`
Type string `js:"type"`
Color string `js:"color"`
TextColor string `js:"textColor"`
Icon string `js:"icon"`
Timeout uint `js:"timeout"`
}
func QuasarGetQuasar() *Quasar {
@ -61,6 +88,18 @@ func QuasarNotify(notification *QuasarNotification) {
GlobalQuasar.Plugins["Notify"].Call("create", notification)
}
func QuasarDialog(notification *QuasarDialogType) {
/*
println("Quasar Notify")
println("Quasar:", GlobalQuasar)
println("Quasar global get:", QuasarGetQuasar().Plugins)
for name, plugin := range GlobalQuasar.Plugins {
println(name,plugin)
}
*/
GlobalQuasar.Plugins["Dialog"].Call("create", notification)
}
func QuasarNotifyError(errorMessage string, messageDetails string, position string) {
notification := &QuasarNotification{Object: O()}
notification.Message = errorMessage
@ -79,4 +118,4 @@ func QuasarNotifySuccess(message string, detailMessage string, position string)
notification.Type = QUASAR_NOTIFICATION_TYPE_POSITIVE
notification.Timeout = QUASAR_NOTIFICATION_TIMEOUT
QuasarNotify(notification)
}
}

View File

@ -40,6 +40,15 @@ func (rpc *Rpc) DeployedEthernetInterfaceSettings(timeout time.Duration, setting
}
func (rpc *Rpc) GetStoredWifiSettingsList(timeout time.Duration) (ws []string, err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
ma, err := rpc.Client.ListStoredWifiSettings(ctx, &pb.Empty{})
if err != nil { return ws, err }
return ma.MsgArray, err
}
func (rpc *Rpc) DeployWifiSettings(timeout time.Duration, settings *pb.WiFiSettings) (state *pb.WiFiState, err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
@ -48,6 +57,15 @@ func (rpc *Rpc) DeployWifiSettings(timeout time.Duration, settings *pb.WiFiSetti
return
}
func (rpc *Rpc) StoreWifiSettings(timeout time.Duration, req *pb.WifiRequestSettingsStorage) (err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
_, err = rpc.Client.StoreWifiSettings(ctx, req)
return
}
func (rpc *Rpc) GetWifiState(timeout time.Duration) (state *jsWiFiState, err error) {
ctx, cancel := context.WithTimeout(context.Background(), timeout)