From 6b2cfe790586348efd0bd743100877e0e0c5518b Mon Sep 17 00:00:00 2001 From: Adrian Gallagher Date: Thu, 13 Jun 2019 17:30:50 +1000 Subject: [PATCH] Daily engine improvements Link up various subsystems to be managed atomically with the ability to start/stop them New subsystem APIs Comms changes --- cmd/gctcli/commands.go | 146 +++ cmd/gctcli/main.go | 4 + communications/base/base_interface.go | 6 +- communications/communications.go | 11 +- communications/communications_test.go | 13 +- config/config_types.go | 12 + engine/comms_relayer.go | 87 ++ engine/connection.go | 2 + engine/engine.go | 53 +- engine/{events => }/events.go | 52 +- .../{events/event_test.go => events_test.go} | 2 +- engine/helpers.go | 81 ++ engine/orders.go | 16 +- engine/portfolio.go | 4 +- engine/rpcserver.go | 46 +- engine/timekeeper.go | 140 +++ gctrpc/rpc.pb.go | 1114 ++++++++++++----- gctrpc/rpc.pb.gw.go | 148 +++ gctrpc/rpc.proto | 53 + gctrpc/rpc.swagger.json | 131 ++ 20 files changed, 1731 insertions(+), 390 deletions(-) create mode 100644 engine/comms_relayer.go rename engine/{events => }/events.go (86%) rename engine/{events/event_test.go => events_test.go} (99%) create mode 100644 engine/timekeeper.go diff --git a/cmd/gctcli/commands.go b/cmd/gctcli/commands.go index a4c5911b..5ce218e2 100644 --- a/cmd/gctcli/commands.go +++ b/cmd/gctcli/commands.go @@ -37,6 +37,152 @@ func getInfo(_ *cli.Context) error { return nil } +var getSubsystemsCommand = cli.Command{ + Name: "getsubsystems", + Usage: "gets GoCryptoTrader subsystems and their status", + Action: getSubsystems, +} + +func getSubsystems(_ *cli.Context) error { + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.GetSubsystems(context.Background(), + &gctrpc.GetSubsystemsRequest{}, + ) + + if err != nil { + return err + } + + jsonOutput(result) + return nil +} + +var enableSubsystemCommand = cli.Command{ + Name: "enablesubsystem", + Usage: "enables an engine subsystem", + ArgsUsage: "", + Action: enableSubsystem, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "subsystem", + Usage: "the subsystem to enable", + }, + }, +} + +func enableSubsystem(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "enablesubsystem") + return nil + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + var subsystemName string + if c.IsSet("subsystem") { + subsystemName = c.String("subsystem") + } else { + subsystemName = c.Args().First() + } + + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.EnableSubsystem(context.Background(), + &gctrpc.GenericSubsystemRequest{ + Subsystem: subsystemName, + }, + ) + + if err != nil { + return err + } + + jsonOutput(result) + return nil +} + +var disableSubsystemCommand = cli.Command{ + Name: "disablesubsystem", + Usage: "disables an engine subsystem", + ArgsUsage: "", + Action: disableSubsystem, + Flags: []cli.Flag{ + cli.StringFlag{ + Name: "subsystem", + Usage: "the subsystem to disable", + }, + }, +} + +func disableSubsystem(c *cli.Context) error { + if c.NArg() == 0 && c.NumFlags() == 0 { + cli.ShowCommandHelp(c, "disablesubsystem") + return nil + } + + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + var subsystemName string + if c.IsSet("subsystem") { + subsystemName = c.String("subsystem") + } else { + subsystemName = c.Args().First() + } + + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.DisableSubsystem(context.Background(), + &gctrpc.GenericSubsystemRequest{ + Subsystem: subsystemName, + }, + ) + + if err != nil { + return err + } + + jsonOutput(result) + return nil +} + +var getRPCEndpointsCommand = cli.Command{ + Name: "getrpcendpoints", + Usage: "gets GoCryptoTrader endpoints info", + Action: getRPCEndpoints, +} + +func getRPCEndpoints(_ *cli.Context) error { + conn, err := setupClient() + if err != nil { + return err + } + defer conn.Close() + + client := gctrpc.NewGoCryptoTraderClient(conn) + result, err := client.GetRPCEndpoints(context.Background(), + &gctrpc.GetRPCEndpointsRequest{}, + ) + + if err != nil { + return err + } + + jsonOutput(result) + return nil +} + var getExchangesCommand = cli.Command{ Name: "getexchanges", Usage: "gets a list of enabled or available exchanges", diff --git a/cmd/gctcli/main.go b/cmd/gctcli/main.go index 36d0f9ba..92c4d77d 100644 --- a/cmd/gctcli/main.go +++ b/cmd/gctcli/main.go @@ -85,6 +85,10 @@ func main() { } app.Commands = []cli.Command{ getInfoCommand, + getSubsystemsCommand, + enableSubsystemCommand, + disableSubsystemCommand, + getRPCEndpointsCommand, getExchangesCommand, enableExchangeCommand, disableExchangeCommand, diff --git a/communications/base/base_interface.go b/communications/base/base_interface.go index 2ec99f6e..a45f486f 100644 --- a/communications/base/base_interface.go +++ b/communications/base/base_interface.go @@ -1,6 +1,7 @@ package base import ( + "errors" "time" "github.com/thrasher-/gocryptotrader/config" @@ -50,7 +51,7 @@ func (c IComm) PushEvent(event Event) { // GetEnabledCommunicationMediums prints out enabled and connected communication // packages // (#debug output only) -func (c IComm) GetEnabledCommunicationMediums() { +func (c IComm) GetEnabledCommunicationMediums() error { var count int for i := range c { if c[i].IsEnabled() && c[i].IsConnected() { @@ -59,6 +60,7 @@ func (c IComm) GetEnabledCommunicationMediums() { } } if count == 0 { - log.Warnf("Communications: No communication mediums are enabled.") + return errors.New("no communication mediums are enabled") } + return nil } diff --git a/communications/communications.go b/communications/communications.go index df93e493..ca2d4497 100644 --- a/communications/communications.go +++ b/communications/communications.go @@ -1,6 +1,8 @@ package communications import ( + "errors" + "github.com/thrasher-/gocryptotrader/communications/base" "github.com/thrasher-/gocryptotrader/communications/slack" "github.com/thrasher-/gocryptotrader/communications/smsglobal" @@ -15,9 +17,12 @@ type Communications struct { } // NewComm sets up and returns a pointer to a Communications object -func NewComm(cfg *config.CommunicationsConfig) *Communications { - var comm Communications +func NewComm(cfg *config.CommunicationsConfig) (*Communications, error) { + if !cfg.IsAnyEnabled() { + return nil, errors.New("no communication relayers enabled") + } + var comm Communications if cfg.TelegramConfig.Enabled { Telegram := new(telegram.Telegram) Telegram.Setup(cfg) @@ -43,5 +48,5 @@ func NewComm(cfg *config.CommunicationsConfig) *Communications { } comm.Setup() - return &comm + return &comm, nil } diff --git a/communications/communications_test.go b/communications/communications_test.go index 04e1c632..2a214c0b 100644 --- a/communications/communications_test.go +++ b/communications/communications_test.go @@ -8,18 +8,19 @@ import ( func TestNewComm(t *testing.T) { var cfg config.CommunicationsConfig - communications := NewComm(&cfg) - - if len(communications.IComm) != 0 { - t.Errorf("Test failed, communications NewComm, expected len 0, got len %d", - len(communications.IComm)) + _, err := NewComm(&cfg) + if err == nil { + t.Error("NewComm should failed on no enabled communication mediums") } cfg.TelegramConfig.Enabled = true cfg.SMSGlobalConfig.Enabled = true cfg.SMTPConfig.Enabled = true cfg.SlackConfig.Enabled = true - communications = NewComm(&cfg) + communications, err := NewComm(&cfg) + if err != nil { + t.Error("Unexpected result") + } if len(communications.IComm) != 4 { t.Errorf("Test failed, communications NewComm, expected len 4, got len %d", diff --git a/config/config_types.go b/config/config_types.go index cd6b59f2..1a535839 100644 --- a/config/config_types.go +++ b/config/config_types.go @@ -202,6 +202,18 @@ type CommunicationsConfig struct { TelegramConfig TelegramConfig `json:"telegram"` } +// IsAnyEnabled returns whether or any any comms relayers +// are enabled +func (c *CommunicationsConfig) IsAnyEnabled() bool { + if c.SMSGlobalConfig.Enabled || + c.SMTPConfig.Enabled || + c.SlackConfig.Enabled || + c.TelegramConfig.Enabled { + return true + } + return false +} + // SlackConfig holds all variables to start and run the Slack package type SlackConfig struct { Name string `json:"name"` diff --git a/engine/comms_relayer.go b/engine/comms_relayer.go new file mode 100644 index 00000000..d1a842a1 --- /dev/null +++ b/engine/comms_relayer.go @@ -0,0 +1,87 @@ +package engine + +import ( + "errors" + "sync/atomic" + + "github.com/thrasher-/gocryptotrader/communications" + "github.com/thrasher-/gocryptotrader/communications/base" + log "github.com/thrasher-/gocryptotrader/logger" +) + +// commsManager starts the NTP manager +type commsManager struct { + started int32 + stopped int32 + shutdown chan struct{} + relayMsg chan base.Event + comms *communications.Communications +} + +func (c *commsManager) Started() bool { + return atomic.LoadInt32(&c.started) == 1 +} + +func (c *commsManager) Start() (err error) { + if atomic.AddInt32(&c.started, 1) != 1 { + return errors.New("communications manager already started") + } + + defer func() { + if err != nil { + atomic.CompareAndSwapInt32(&c.started, 1, 0) + } + }() + + log.Debugln("Communications manager starting...") + commsCfg := Bot.Config.GetCommunicationsConfig() + c.comms, err = communications.NewComm(&commsCfg) + if err != nil { + return err + } + + c.shutdown = make(chan struct{}) + c.relayMsg = make(chan base.Event) + go c.run() + log.Debugln("Communications manager started.") + return nil +} + +func (c *commsManager) Stop() error { + if atomic.LoadInt32(&c.started) == 0 { + return errors.New("communications manager not started") + } + + if atomic.AddInt32(&c.stopped, 1) != 1 { + return errors.New("communications manager is already stopped") + } + + close(c.shutdown) + log.Debugln("Communications manager shutting down...") + return nil +} + +func (c *commsManager) PushEvent(evt base.Event) { + if !c.Started() { + return + } + c.relayMsg <- evt +} + +func (c *commsManager) run() { + defer func() { + // TO-DO shutdown comms connections for connected services (Slack etc) + atomic.CompareAndSwapInt32(&c.stopped, 1, 0) + atomic.CompareAndSwapInt32(&c.started, 1, 0) + log.Debugln("Communications manager shutdown.") + }() + + for { + select { + case msg := <-c.relayMsg: + c.comms.PushEvent(msg) + case <-c.shutdown: + return + } + } +} diff --git a/engine/connection.go b/engine/connection.go index f104c256..0b16c8e3 100644 --- a/engine/connection.go +++ b/engine/connection.go @@ -49,6 +49,8 @@ func (c *connectionManager) Stop() error { log.Debugln("Connection manager shutting down...") c.conn.Shutdown() + atomic.CompareAndSwapInt32(&c.stopped, 1, 0) + atomic.CompareAndSwapInt32(&c.started, 1, 0) log.Debugln("Connection manager stopped.") return nil } diff --git a/engine/engine.go b/engine/engine.go index 7c513bb3..15f803c4 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -12,15 +12,12 @@ import ( "time" "github.com/thrasher-/gocryptotrader/common" - "github.com/thrasher-/gocryptotrader/communications" "github.com/thrasher-/gocryptotrader/config" "github.com/thrasher-/gocryptotrader/currency" "github.com/thrasher-/gocryptotrader/currency/coinmarketcap" - "github.com/thrasher-/gocryptotrader/engine/events" exchange "github.com/thrasher-/gocryptotrader/exchanges" "github.com/thrasher-/gocryptotrader/exchanges/request" log "github.com/thrasher-/gocryptotrader/logger" - "github.com/thrasher-/gocryptotrader/ntpclient" "github.com/thrasher-/gocryptotrader/portfolio" "github.com/thrasher-/gocryptotrader/utils" ) @@ -32,10 +29,11 @@ type Engine struct { Portfolio *portfolio.Base Exchanges []exchange.IBotExchange ExchangeCurrencyPairManager *ExchangeCurrencyPairSyncer + NTPManager ntpManager ConnectionManager connectionManager OrderManager orderManager PortfolioManager portfolioManager - CommsRelayer *communications.Communications + CommsManager commsManager Shutdown chan struct{} Settings Settings CryptocurrencyDepositAddresses map[string]map[string]string @@ -148,11 +146,10 @@ func ValidateSettings(b *Engine, s *Settings) { b.Settings.EnableEventManager = s.EnableEventManager if b.Settings.EnableEventManager { - events.Verbose = b.Settings.Verbose if b.Settings.EventManagerDelay != time.Duration(0) && s.EventManagerDelay > 0 { b.Settings.EventManagerDelay = s.EventManagerDelay } else { - b.Settings.EventManagerDelay = events.SleepDelay + b.Settings.EventManagerDelay = EventSleepDelay } } @@ -273,27 +270,8 @@ func (e *Engine) Start() { } if e.Settings.EnableNTPClient { - if e.Config.NTPClient.Level != -1 { - NTPTime, errNTP := ntpclient.NTPClient(e.Config.NTPClient.Pool) - currentTime := time.Now() - if errNTP != nil { - log.Warnf("NTPClient failed to create: %v", errNTP) - } else { - NTPcurrentTimeDifference := NTPTime.Sub(currentTime) - configNTPTime := *e.Config.NTPClient.AllowedDifference - configNTPNegativeTime := (*e.Config.NTPClient.AllowedNegativeDifference - (*e.Config.NTPClient.AllowedNegativeDifference * 2)) - if NTPcurrentTimeDifference > configNTPTime || NTPcurrentTimeDifference < configNTPNegativeTime { - log.Warnf("Time out of sync (NTP): %v | (time.Now()): %v | (Difference): %v | (Allowed): +%v / %v", NTPTime, currentTime, NTPcurrentTimeDifference, configNTPTime, configNTPNegativeTime) - if e.Config.NTPClient.Level == 0 { - disable, errNTP := e.Config.DisableNTPCheck(os.Stdin) - if errNTP != nil { - log.Errorf("failed to disable ntp time check reason: %v", errNTP) - } else { - log.Info(disable) - } - } - } - } + if err := e.NTPManager.Start(); err != nil { + log.Errorf("NTP manager unable to start: %v", err) } } @@ -322,10 +300,9 @@ func (e *Engine) Start() { } if e.Settings.EnableCommsRelayer { - log.Debugln("Starting communication mediums..") - commsCfg := e.Config.GetCommunicationsConfig() - e.CommsRelayer = communications.NewComm(&commsCfg) - e.CommsRelayer.GetEnabledCommunicationMediums() + if err := e.CommsManager.Start(); err != nil { + log.Errorf("Communications manager unable to start: %v", err) + } } var newFxSettings []currency.FXSettings @@ -398,7 +375,7 @@ func (e *Engine) Start() { } if e.Settings.EnableEventManager { - go events.EventManger() + go EventManger() } <-e.Shutdown @@ -419,6 +396,18 @@ func (e *Engine) Stop() { } } + if e.NTPManager.Started() { + if err := e.NTPManager.Stop(); err != nil { + log.Errorf("NTP manager unable to stop. Error: %v", err) + } + } + + if e.CommsManager.Started() { + if err := e.CommsManager.Stop(); err != nil { + log.Errorf("Communication manager unable to stop. Error: %v", err) + } + } + if e.PortfolioManager.Started() { if err := e.PortfolioManager.Stop(); err != nil { log.Errorf("Fund manager unable to stop. Error: %v", err) diff --git a/engine/events/events.go b/engine/events.go similarity index 86% rename from engine/events/events.go rename to engine/events.go index 5b6df499..b2fa5d76 100644 --- a/engine/events/events.go +++ b/engine/events.go @@ -1,4 +1,4 @@ -package events +package engine import ( "errors" @@ -6,7 +6,6 @@ import ( "strings" "time" - "github.com/thrasher-/gocryptotrader/communications" "github.com/thrasher-/gocryptotrader/communications/base" "github.com/thrasher-/gocryptotrader/config" "github.com/thrasher-/gocryptotrader/currency" @@ -16,6 +15,8 @@ import ( log "github.com/thrasher-/gocryptotrader/logger" ) +// TO-DO MAKE THIS A SERVICE SUBSYSTEM + // Event const vars const ( ItemPrice = "PRICE" @@ -32,7 +33,6 @@ const ( ActionTest = "ACTION_TEST" defaultSleepDelay = time.Millisecond * 500 - defaultVerbose = true ) // vars related to events package @@ -41,16 +41,11 @@ var ( errInvalidCondition = errors.New("invalid conditional option") errInvalidAction = errors.New("invalid action") errExchangeDisabled = errors.New("desired exchange is disabled") - - SleepDelay = defaultSleepDelay - Verbose = defaultVerbose - - // NOTE comms is an interim implementation - comms *communications.Communications + EventSleepDelay = defaultSleepDelay ) -// ConditionParams holds the event condition variables -type ConditionParams struct { +// EventConditionParams holds the event condition variables +type EventConditionParams struct { Condition string Price float64 @@ -64,7 +59,7 @@ type Event struct { ID int64 Exchange string Item string - Condition ConditionParams + Condition EventConditionParams Pair currency.Pair Asset assets.AssetType Action string @@ -75,15 +70,9 @@ type Event struct { // appended var Events []*Event -// SetComms is an interim function that will support a median integration. This -// sets the current comms package. -func SetComms(commsP *communications.Communications) { - comms = commsP -} - // Add adds an event to the Events chain and returns an index/eventID // and an error -func Add(exchange, item string, condition ConditionParams, currencyPair currency.Pair, asset assets.AssetType, action string) (int64, error) { +func Add(exchange, item string, condition EventConditionParams, currencyPair currency.Pair, asset assets.AssetType, action string) (int64, error) { err := IsValidEvent(exchange, item, condition, action) if err != nil { return 0, err @@ -139,7 +128,7 @@ func (e *Event) ExecuteAction() bool { if action[0] == ActionSMSNotify { message := fmt.Sprintf("Event triggered: %s", e.String()) if action[1] == "ALL" { - comms.PushEvent(base.Event{ + Bot.CommsManager.PushEvent(base.Event{ Type: "event", Message: message, }) @@ -164,7 +153,7 @@ func (e *Event) processTicker() bool { t, err := ticker.GetTicker(e.Exchange, e.Pair, e.Asset) if err != nil { - if Verbose { + if Bot.Settings.Verbose { log.Debugf("Events: failed to get ticker. Err: %s", err) } return false @@ -173,7 +162,7 @@ func (e *Event) processTicker() bool { lastPrice := t.Last if lastPrice == 0 { - if Verbose { + if Bot.Settings.Verbose { log.Debugln("Events: ticker last price is 0") } return false @@ -211,7 +200,7 @@ func (e *Event) processCondition(actual, threshold float64) bool { func (e *Event) processOrderbook() bool { ob, err := orderbook.Get(e.Exchange, e.Pair, e.Asset) if err != nil { - if Verbose { + if Bot.Settings.Verbose { log.Debugf("Events: Failed to get orderbook. Err: %s", err) } return false @@ -242,18 +231,17 @@ func (e *Event) processOrderbook() bool { return success } -// CheckCondition will check the event structure to see if there is a condition +// CheckEventCondition will check the event structure to see if there is a condition // met -func (e *Event) CheckCondition() bool { +func (e *Event) CheckEventCondition() bool { if e.Item == ItemPrice { return e.processTicker() } - return e.processOrderbook() } // IsValidEvent checks the actions to be taken and returns an error if incorrect -func IsValidEvent(exchange, item string, condition ConditionParams, action string) error { +func IsValidEvent(exchange, item string, condition EventConditionParams, action string) error { exchange = strings.ToUpper(exchange) item = strings.ToUpper(item) action = strings.ToUpper(action) @@ -290,7 +278,7 @@ func IsValidEvent(exchange, item string, condition ConditionParams, action strin } if a[1] != "ALL" { - comms.PushEvent(base.Event{Type: a[1]}) + Bot.CommsManager.PushEvent(base.Event{Type: a[1]}) } } else if action != ActionConsolePrint && action != ActionTest { return errInvalidAction @@ -302,17 +290,17 @@ func IsValidEvent(exchange, item string, condition ConditionParams, action strin // EventManger is the overarching routine that will iterate through the Events // chain func EventManger() { - log.Debugf("EventManager started. SleepDelay: %v", SleepDelay.String()) + log.Debugf("EventManager started. SleepDelay: %v", EventSleepDelay.String()) for { total, executed := GetEventCounter() if total > 0 && executed != total { for _, event := range Events { if !event.Executed { - if Verbose { + if Bot.Settings.Verbose { log.Debugf("Events: Processing event %s.", event.String()) } - success := event.CheckCondition() + success := event.CheckEventCondition() if success { log.Debugf( "Events: ID: %d triggered on %s successfully.\n", event.ID, @@ -323,7 +311,7 @@ func EventManger() { } } } - time.Sleep(SleepDelay) + time.Sleep(EventSleepDelay) } } diff --git a/engine/events/event_test.go b/engine/events_test.go similarity index 99% rename from engine/events/event_test.go rename to engine/events_test.go index 4cb1149b..966fd2c4 100644 --- a/engine/events/event_test.go +++ b/engine/events_test.go @@ -1,4 +1,4 @@ -package events +package engine // // import ( diff --git a/engine/helpers.go b/engine/helpers.go index 938efa6e..eb33fd9d 100644 --- a/engine/helpers.go +++ b/engine/helpers.go @@ -29,6 +29,87 @@ import ( "github.com/thrasher-/gocryptotrader/utils" ) +// GetSubsystemsStatus returns the status of various subsystems +func GetSubsystemsStatus() map[string]bool { + systems := make(map[string]bool) + systems["communications"] = Bot.CommsManager.Started() + systems["internet_monitor"] = Bot.ConnectionManager.Started() + systems["orders"] = Bot.OrderManager.Started() + systems["portfolio"] = Bot.PortfolioManager.Started() + systems["ntp_timekeeper"] = Bot.NTPManager.Started() + systems["exchange_syncer"] = Bot.Settings.EnableExchangeSyncManager + systems["grpc"] = Bot.Settings.EnableGRPC + systems["grpc_proxy"] = Bot.Settings.EnableGRPCProxy + systems["deprecated_rpc"] = Bot.Settings.EnableDeprecatedRPC + systems["websocket_rpc"] = Bot.Settings.EnableWebsocketRPC + return systems +} + +// RPCEndpoint stores an RPC endpoint status and addr +type RPCEndpoint struct { + Started bool + ListenAddr string +} + +// GetRPCEndpoints returns a list of RPC endpoints and their listen addrs +func GetRPCEndpoints() map[string]RPCEndpoint { + endpoints := make(map[string]RPCEndpoint) + endpoints["grpc"] = RPCEndpoint{ + Started: Bot.Settings.EnableGRPC, + ListenAddr: "grpc://" + Bot.Config.RemoteControl.GRPC.ListenAddress, + } + endpoints["grpc_proxy"] = RPCEndpoint{ + Started: Bot.Settings.EnableGRPCProxy, + ListenAddr: "http://" + Bot.Config.RemoteControl.GRPC.GRPCProxyListenAddress, + } + endpoints["deprecated_rpc"] = RPCEndpoint{ + Started: Bot.Settings.EnableDeprecatedRPC, + ListenAddr: "http://" + Bot.Config.RemoteControl.DeprecatedRPC.ListenAddress, + } + endpoints["websocket_rpc"] = RPCEndpoint{ + Started: Bot.Settings.EnableWebsocketRPC, + ListenAddr: "ws://" + Bot.Config.RemoteControl.WebsocketRPC.ListenAddress, + } + return endpoints +} + +// SetSubsystem enables or disables an engine subsystem +func SetSubsystem(subsys string, enable bool) error { + switch strings.ToLower(subsys) { + case "communications": + if enable { + return Bot.CommsManager.Start() + } + return Bot.CommsManager.Stop() + case "internet_monitor": + if enable { + return Bot.ConnectionManager.Start() + } + return Bot.CommsManager.Stop() + case "orders": + if enable { + return Bot.OrderManager.Start() + } + return Bot.OrderManager.Stop() + case "portfolio": + if enable { + return Bot.PortfolioManager.Start() + } + return Bot.OrderManager.Stop() + case "ntp_timekeeper": + if enable { + return Bot.NTPManager.Start() + } + return Bot.NTPManager.Stop() + case "exchange_syncer": + if enable { + Bot.ExchangeCurrencyPairManager.Start() + } + Bot.ExchangeCurrencyPairManager.Stop() + } + return errors.New("subsystem not found") +} + // GetExchangeOTPs returns OTP codes for all exchanges which have a otpsecret // stored func GetExchangeOTPs() (map[string]string, error) { diff --git a/engine/orders.go b/engine/orders.go index c6870a13..07aa93b1 100644 --- a/engine/orders.go +++ b/engine/orders.go @@ -72,9 +72,17 @@ func (o *orderManager) Start() error { return nil } func (o *orderManager) Stop() error { + if atomic.LoadInt32(&o.started) == 0 { + return errors.New("order manager not started") + } + if atomic.AddInt32(&o.stopped, 1) != 1 { return errors.New("order manager is already stopped") } + defer func() { + atomic.CompareAndSwapInt32(&o.stopped, 1, 0) + atomic.CompareAndSwapInt32(&o.started, 1, 0) + }() log.Debugln("Order manager shutting down...") close(o.shutdown) @@ -101,7 +109,7 @@ func (o *orderManager) gracefulShutdown() { msg := fmt.Sprintf("Order manager: Exchange %s unable to cancel order ID=%v. Err: %s", k, v[y].ID, err) log.Debugln(msg) - Bot.CommsRelayer.PushEvent(base.Event{ + Bot.CommsManager.PushEvent(base.Event{ Type: "order", Message: msg, }) @@ -111,7 +119,7 @@ func (o *orderManager) gracefulShutdown() { msg := fmt.Sprintf("Order manager: Exchange %s order ID=%v cancelled.", k, v[y].ID) log.Debugln(msg) - Bot.CommsRelayer.PushEvent(base.Event{ + Bot.CommsManager.PushEvent(base.Event{ Type: "order", Message: msg, }) @@ -222,7 +230,7 @@ func (o *orderManager) Submit(exchName string, order *exchange.OrderSubmission) msg := fmt.Sprintf("Order manager: Exchange %s submitted order ID=%v [Ours: %v] pair=%v price=%v amount=%v side=%v type=%v.", exchName, result.OrderID, id.String(), order.Pair, order.Price, order.Amount, order.OrderSide, order.OrderType) log.Debugln(msg) - Bot.CommsRelayer.PushEvent(base.Event{ + Bot.CommsManager.PushEvent(base.Event{ Type: "order", Message: msg, }) @@ -257,7 +265,7 @@ func (o *orderManager) processOrders() { msg := fmt.Sprintf("Order manager: Exchange %s added order ID=%v pair=%v price=%v amount=%v side=%v type=%v.", order.Exchange, order.ID, order.CurrencyPair, order.Price, order.Amount, order.OrderSide, order.OrderType) log.Debug(msg) - Bot.CommsRelayer.PushEvent(base.Event{ + Bot.CommsManager.PushEvent(base.Event{ Type: "order", Message: msg, }) diff --git a/engine/portfolio.go b/engine/portfolio.go index 5d91d2b7..3116472f 100644 --- a/engine/portfolio.go +++ b/engine/portfolio.go @@ -51,9 +51,11 @@ func (p *portfolioManager) run() { Bot.ServicesWG.Add(1) tick := time.NewTicker(PortfolioSleepDelay) defer func() { - log.Debugf("Portfolio manager shutdown.") + atomic.CompareAndSwapInt32(&p.stopped, 1, 0) + atomic.CompareAndSwapInt32(&p.started, 1, 0) tick.Stop() Bot.ServicesWG.Done() + log.Debugf("Portfolio manager shutdown.") }() for { diff --git a/engine/rpcserver.go b/engine/rpcserver.go index 6fd20978..958e2194 100644 --- a/engine/rpcserver.go +++ b/engine/rpcserver.go @@ -15,7 +15,6 @@ import ( "github.com/thrasher-/gocryptotrader/common" "github.com/thrasher-/gocryptotrader/common/crypto" "github.com/thrasher-/gocryptotrader/currency" - "github.com/thrasher-/gocryptotrader/engine/events" exchange "github.com/thrasher-/gocryptotrader/exchanges" "github.com/thrasher-/gocryptotrader/exchanges/assets" "github.com/thrasher-/gocryptotrader/gctrpc" @@ -152,8 +151,47 @@ func (s *RPCServer) GetInfo(ctx context.Context, r *gctrpc.GetInfoRequest) (*gct AvailableExchanges: int64(len(Bot.Config.Exchanges)), DefaultFiatCurrency: Bot.Config.Currency.FiatDisplayCurrency.String(), DefaultForexProvider: Bot.Config.GetPrimaryForexProvider(), + SubsystemStatus: GetSubsystemsStatus(), } + endpoints := GetRPCEndpoints() + resp.RpcEndpoints = make(map[string]*gctrpc.RPCEndpoint) + for k, v := range endpoints { + resp.RpcEndpoints[k] = &gctrpc.RPCEndpoint{ + Started: v.Started, + ListenAddress: v.ListenAddr, + } + } + return &resp, nil +} +// GetSubsystems returns a list of subsystems and their status +func (s *RPCServer) GetSubsystems(ctx context.Context, r *gctrpc.GetSubsystemsRequest) (*gctrpc.GetSusbsytemsResponse, error) { + return &gctrpc.GetSusbsytemsResponse{SubsystemsStatus: GetSubsystemsStatus()}, nil +} + +// EnableSubsystem enables a engine subsytem +func (s *RPCServer) EnableSubsystem(ctx context.Context, r *gctrpc.GenericSubsystemRequest) (*gctrpc.GenericSubsystemResponse, error) { + err := SetSubsystem(r.Subsystem, true) + return &gctrpc.GenericSubsystemResponse{}, err +} + +// DisableSubsystem disables a engine subsytem +func (s *RPCServer) DisableSubsystem(ctx context.Context, r *gctrpc.GenericSubsystemRequest) (*gctrpc.GenericSubsystemResponse, error) { + err := SetSubsystem(r.Subsystem, false) + return &gctrpc.GenericSubsystemResponse{}, err +} + +// GetRPCEndpoints returns a list of API endpoints +func (s *RPCServer) GetRPCEndpoints(ctx context.Context, r *gctrpc.GetRPCEndpointsRequest) (*gctrpc.GetRPCEndpointsResponse, error) { + endpoints := GetRPCEndpoints() + var resp gctrpc.GetRPCEndpointsResponse + resp.Endpoints = make(map[string]*gctrpc.RPCEndpoint) + for k, v := range endpoints { + resp.Endpoints[k] = &gctrpc.RPCEndpoint{ + Started: v.Started, + ListenAddress: v.ListenAddr, + } + } return &resp, nil } @@ -638,7 +676,7 @@ func (s *RPCServer) GetEvents(ctx context.Context, r *gctrpc.GetEventsRequest) ( // AddEvent adds an event func (s *RPCServer) AddEvent(ctx context.Context, r *gctrpc.AddEventRequest) (*gctrpc.AddEventResponse, error) { - evtCondition := events.ConditionParams{ + evtCondition := EventConditionParams{ CheckBids: r.ConditionParams.CheckBids, CheckBidsAndAsks: r.ConditionParams.CheckBidsAndAsks, Condition: r.ConditionParams.Condition, @@ -649,7 +687,7 @@ func (s *RPCServer) AddEvent(ctx context.Context, r *gctrpc.AddEventRequest) (*g p := currency.NewPairWithDelimiter(r.Pair.Base, r.Pair.Quote, r.Pair.Delimiter) - id, err := events.Add(r.Exchange, r.Item, evtCondition, p, assets.AssetType(r.AssetType), r.Action) + id, err := Add(r.Exchange, r.Item, evtCondition, p, assets.AssetType(r.AssetType), r.Action) if err != nil { return nil, err } @@ -659,7 +697,7 @@ func (s *RPCServer) AddEvent(ctx context.Context, r *gctrpc.AddEventRequest) (*g // RemoveEvent removes an event, specified by an event ID func (s *RPCServer) RemoveEvent(ctx context.Context, r *gctrpc.RemoveEventRequest) (*gctrpc.RemoveEventResponse, error) { - events.Remove(r.Id) + Remove(r.Id) return &gctrpc.RemoveEventResponse{}, nil } diff --git a/engine/timekeeper.go b/engine/timekeeper.go new file mode 100644 index 00000000..b42fbd1c --- /dev/null +++ b/engine/timekeeper.go @@ -0,0 +1,140 @@ +package engine + +import ( + "errors" + "fmt" + "os" + "sync/atomic" + "time" + + log "github.com/thrasher-/gocryptotrader/logger" + ntpclient "github.com/thrasher-/gocryptotrader/ntpclient" +) + +// vars related to the NTP manager +var ( + NTPCheckInterval = time.Second * 30 + NTPRetryLimit = 3 + errNTPDisabled = errors.New("ntp client disabled") +) + +// ntpManager starts the NTP manager +type ntpManager struct { + started int32 + stopped int32 + inititalCheck bool + shutdown chan struct{} +} + +func (n *ntpManager) Started() bool { + return atomic.LoadInt32(&n.started) == 1 +} + +func (n *ntpManager) Start() (err error) { + if atomic.AddInt32(&n.started, 1) != 1 { + return errors.New("NTP manager already started") + } + + var disable bool + defer func() { + if err != nil || disable { + atomic.CompareAndSwapInt32(&n.started, 1, 0) + } + }() + + log.Debugln("NTP manager starting...") + if Bot.Config.NTPClient.Level == 0 { + // Initial NTP check (prompts user on how we should proceed) + n.inititalCheck = true + + // Sometimes the NTP client can have transient issues due to UDP, try + // the default retry limits before giving up + for i := 0; i < NTPRetryLimit; i++ { + err = n.processTime() + switch err { + case nil: + break + case errNTPDisabled: + log.Debugf("NTP manager: User disabled NTP prompts. Exiting.") + disable = true + err = nil + return + default: + if i == NTPRetryLimit-1 { + return err + } + } + } + } + n.shutdown = make(chan struct{}) + go n.run() + log.Debugln("NTP manager started.") + return nil +} + +func (n *ntpManager) Stop() error { + if atomic.LoadInt32(&n.started) == 0 { + return errors.New("NTP manager not started") + } + + if atomic.AddInt32(&n.stopped, 1) != 1 { + return errors.New("NTP manager is already stopped") + } + + close(n.shutdown) + log.Debugln("NTP manager shutting down...") + return nil +} + +func (n *ntpManager) run() { + t := time.NewTicker(NTPCheckInterval) + defer func() { + t.Stop() + atomic.CompareAndSwapInt32(&n.stopped, 1, 0) + atomic.CompareAndSwapInt32(&n.started, 1, 0) + log.Debugln("NTP manager shutdown.") + }() + + for { + select { + case <-n.shutdown: + return + case <-t.C: + n.processTime() + if Bot.Config.NTPClient.Level == 0 { + close(n.shutdown) + } + } + } +} + +func (n *ntpManager) FetchNTPTime() (time.Time, error) { + return ntpclient.NTPClient(Bot.Config.NTPClient.Pool) +} + +func (n *ntpManager) processTime() error { + NTPTime, err := n.FetchNTPTime() + if err != nil { + return err + } + + currentTime := time.Now() + NTPcurrentTimeDifference := NTPTime.Sub(currentTime) + configNTPTime := *Bot.Config.NTPClient.AllowedDifference + configNTPNegativeTime := (*Bot.Config.NTPClient.AllowedNegativeDifference - (*Bot.Config.NTPClient.AllowedNegativeDifference * 2)) + if NTPcurrentTimeDifference > configNTPTime || NTPcurrentTimeDifference < configNTPNegativeTime { + log.Warnf("NTP manager: Time out of sync (NTP): %v | (time.Now()): %v | (Difference): %v | (Allowed): +%v / %v", NTPTime, currentTime, NTPcurrentTimeDifference, configNTPTime, configNTPNegativeTime) + if n.inititalCheck { + n.inititalCheck = false + disable, err := Bot.Config.DisableNTPCheck(os.Stdin) + if err != nil { + return fmt.Errorf("unable to disable NTP check: %s", err) + } + log.Info(disable) + if Bot.Config.NTPClient.Level == -1 { + return errNTPDisabled + } + } + } + return nil +} diff --git a/gctrpc/rpc.pb.go b/gctrpc/rpc.pb.go index 70fa45fc..64af67fa 100644 --- a/gctrpc/rpc.pb.go +++ b/gctrpc/rpc.pb.go @@ -55,14 +55,16 @@ func (m *GetInfoRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetInfoRequest proto.InternalMessageInfo type GetInfoResponse struct { - Uptime string `protobuf:"bytes,1,opt,name=uptime,proto3" json:"uptime,omitempty"` - AvailableExchanges int64 `protobuf:"varint,2,opt,name=available_exchanges,json=availableExchanges,proto3" json:"available_exchanges,omitempty"` - EnabledExchanges int64 `protobuf:"varint,3,opt,name=enabled_exchanges,json=enabledExchanges,proto3" json:"enabled_exchanges,omitempty"` - DefaultForexProvider string `protobuf:"bytes,4,opt,name=default_forex_provider,json=defaultForexProvider,proto3" json:"default_forex_provider,omitempty"` - DefaultFiatCurrency string `protobuf:"bytes,5,opt,name=default_fiat_currency,json=defaultFiatCurrency,proto3" json:"default_fiat_currency,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Uptime string `protobuf:"bytes,1,opt,name=uptime,proto3" json:"uptime,omitempty"` + AvailableExchanges int64 `protobuf:"varint,2,opt,name=available_exchanges,json=availableExchanges,proto3" json:"available_exchanges,omitempty"` + EnabledExchanges int64 `protobuf:"varint,3,opt,name=enabled_exchanges,json=enabledExchanges,proto3" json:"enabled_exchanges,omitempty"` + DefaultForexProvider string `protobuf:"bytes,4,opt,name=default_forex_provider,json=defaultForexProvider,proto3" json:"default_forex_provider,omitempty"` + DefaultFiatCurrency string `protobuf:"bytes,5,opt,name=default_fiat_currency,json=defaultFiatCurrency,proto3" json:"default_fiat_currency,omitempty"` + SubsystemStatus map[string]bool `protobuf:"bytes,6,rep,name=subsystem_status,json=subsystemStatus,proto3" json:"subsystem_status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + RpcEndpoints map[string]*RPCEndpoint `protobuf:"bytes,7,rep,name=rpc_endpoints,json=rpcEndpoints,proto3" json:"rpc_endpoints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} } @@ -125,6 +127,340 @@ func (m *GetInfoResponse) GetDefaultFiatCurrency() string { return "" } +func (m *GetInfoResponse) GetSubsystemStatus() map[string]bool { + if m != nil { + return m.SubsystemStatus + } + return nil +} + +func (m *GetInfoResponse) GetRpcEndpoints() map[string]*RPCEndpoint { + if m != nil { + return m.RpcEndpoints + } + return nil +} + +// TO-DO comms APIs +type GetCommunicationRelayersRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetCommunicationRelayersRequest) Reset() { *m = GetCommunicationRelayersRequest{} } +func (m *GetCommunicationRelayersRequest) String() string { return proto.CompactTextString(m) } +func (*GetCommunicationRelayersRequest) ProtoMessage() {} +func (*GetCommunicationRelayersRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{2} +} + +func (m *GetCommunicationRelayersRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetCommunicationRelayersRequest.Unmarshal(m, b) +} +func (m *GetCommunicationRelayersRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetCommunicationRelayersRequest.Marshal(b, m, deterministic) +} +func (m *GetCommunicationRelayersRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetCommunicationRelayersRequest.Merge(m, src) +} +func (m *GetCommunicationRelayersRequest) XXX_Size() int { + return xxx_messageInfo_GetCommunicationRelayersRequest.Size(m) +} +func (m *GetCommunicationRelayersRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetCommunicationRelayersRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetCommunicationRelayersRequest proto.InternalMessageInfo + +type GetCommunicationRelayersResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetCommunicationRelayersResponse) Reset() { *m = GetCommunicationRelayersResponse{} } +func (m *GetCommunicationRelayersResponse) String() string { return proto.CompactTextString(m) } +func (*GetCommunicationRelayersResponse) ProtoMessage() {} +func (*GetCommunicationRelayersResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{3} +} + +func (m *GetCommunicationRelayersResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetCommunicationRelayersResponse.Unmarshal(m, b) +} +func (m *GetCommunicationRelayersResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetCommunicationRelayersResponse.Marshal(b, m, deterministic) +} +func (m *GetCommunicationRelayersResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetCommunicationRelayersResponse.Merge(m, src) +} +func (m *GetCommunicationRelayersResponse) XXX_Size() int { + return xxx_messageInfo_GetCommunicationRelayersResponse.Size(m) +} +func (m *GetCommunicationRelayersResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetCommunicationRelayersResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetCommunicationRelayersResponse proto.InternalMessageInfo + +type GenericSubsystemRequest struct { + Subsystem string `protobuf:"bytes,1,opt,name=subsystem,proto3" json:"subsystem,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GenericSubsystemRequest) Reset() { *m = GenericSubsystemRequest{} } +func (m *GenericSubsystemRequest) String() string { return proto.CompactTextString(m) } +func (*GenericSubsystemRequest) ProtoMessage() {} +func (*GenericSubsystemRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{4} +} + +func (m *GenericSubsystemRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GenericSubsystemRequest.Unmarshal(m, b) +} +func (m *GenericSubsystemRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GenericSubsystemRequest.Marshal(b, m, deterministic) +} +func (m *GenericSubsystemRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenericSubsystemRequest.Merge(m, src) +} +func (m *GenericSubsystemRequest) XXX_Size() int { + return xxx_messageInfo_GenericSubsystemRequest.Size(m) +} +func (m *GenericSubsystemRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GenericSubsystemRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GenericSubsystemRequest proto.InternalMessageInfo + +func (m *GenericSubsystemRequest) GetSubsystem() string { + if m != nil { + return m.Subsystem + } + return "" +} + +type GenericSubsystemResponse struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GenericSubsystemResponse) Reset() { *m = GenericSubsystemResponse{} } +func (m *GenericSubsystemResponse) String() string { return proto.CompactTextString(m) } +func (*GenericSubsystemResponse) ProtoMessage() {} +func (*GenericSubsystemResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{5} +} + +func (m *GenericSubsystemResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GenericSubsystemResponse.Unmarshal(m, b) +} +func (m *GenericSubsystemResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GenericSubsystemResponse.Marshal(b, m, deterministic) +} +func (m *GenericSubsystemResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GenericSubsystemResponse.Merge(m, src) +} +func (m *GenericSubsystemResponse) XXX_Size() int { + return xxx_messageInfo_GenericSubsystemResponse.Size(m) +} +func (m *GenericSubsystemResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GenericSubsystemResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GenericSubsystemResponse proto.InternalMessageInfo + +type GetSubsystemsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetSubsystemsRequest) Reset() { *m = GetSubsystemsRequest{} } +func (m *GetSubsystemsRequest) String() string { return proto.CompactTextString(m) } +func (*GetSubsystemsRequest) ProtoMessage() {} +func (*GetSubsystemsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{6} +} + +func (m *GetSubsystemsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetSubsystemsRequest.Unmarshal(m, b) +} +func (m *GetSubsystemsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetSubsystemsRequest.Marshal(b, m, deterministic) +} +func (m *GetSubsystemsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetSubsystemsRequest.Merge(m, src) +} +func (m *GetSubsystemsRequest) XXX_Size() int { + return xxx_messageInfo_GetSubsystemsRequest.Size(m) +} +func (m *GetSubsystemsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetSubsystemsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetSubsystemsRequest proto.InternalMessageInfo + +type GetSusbsytemsResponse struct { + SubsystemsStatus map[string]bool `protobuf:"bytes,1,rep,name=subsystems_status,json=subsystemsStatus,proto3" json:"subsystems_status,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetSusbsytemsResponse) Reset() { *m = GetSusbsytemsResponse{} } +func (m *GetSusbsytemsResponse) String() string { return proto.CompactTextString(m) } +func (*GetSusbsytemsResponse) ProtoMessage() {} +func (*GetSusbsytemsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{7} +} + +func (m *GetSusbsytemsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetSusbsytemsResponse.Unmarshal(m, b) +} +func (m *GetSusbsytemsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetSusbsytemsResponse.Marshal(b, m, deterministic) +} +func (m *GetSusbsytemsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetSusbsytemsResponse.Merge(m, src) +} +func (m *GetSusbsytemsResponse) XXX_Size() int { + return xxx_messageInfo_GetSusbsytemsResponse.Size(m) +} +func (m *GetSusbsytemsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetSusbsytemsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetSusbsytemsResponse proto.InternalMessageInfo + +func (m *GetSusbsytemsResponse) GetSubsystemsStatus() map[string]bool { + if m != nil { + return m.SubsystemsStatus + } + return nil +} + +type GetRPCEndpointsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetRPCEndpointsRequest) Reset() { *m = GetRPCEndpointsRequest{} } +func (m *GetRPCEndpointsRequest) String() string { return proto.CompactTextString(m) } +func (*GetRPCEndpointsRequest) ProtoMessage() {} +func (*GetRPCEndpointsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{8} +} + +func (m *GetRPCEndpointsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetRPCEndpointsRequest.Unmarshal(m, b) +} +func (m *GetRPCEndpointsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetRPCEndpointsRequest.Marshal(b, m, deterministic) +} +func (m *GetRPCEndpointsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRPCEndpointsRequest.Merge(m, src) +} +func (m *GetRPCEndpointsRequest) XXX_Size() int { + return xxx_messageInfo_GetRPCEndpointsRequest.Size(m) +} +func (m *GetRPCEndpointsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetRPCEndpointsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetRPCEndpointsRequest proto.InternalMessageInfo + +type RPCEndpoint struct { + Started bool `protobuf:"varint,1,opt,name=started,proto3" json:"started,omitempty"` + ListenAddress string `protobuf:"bytes,2,opt,name=listen_address,json=listenAddress,proto3" json:"listen_address,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RPCEndpoint) Reset() { *m = RPCEndpoint{} } +func (m *RPCEndpoint) String() string { return proto.CompactTextString(m) } +func (*RPCEndpoint) ProtoMessage() {} +func (*RPCEndpoint) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{9} +} + +func (m *RPCEndpoint) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_RPCEndpoint.Unmarshal(m, b) +} +func (m *RPCEndpoint) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_RPCEndpoint.Marshal(b, m, deterministic) +} +func (m *RPCEndpoint) XXX_Merge(src proto.Message) { + xxx_messageInfo_RPCEndpoint.Merge(m, src) +} +func (m *RPCEndpoint) XXX_Size() int { + return xxx_messageInfo_RPCEndpoint.Size(m) +} +func (m *RPCEndpoint) XXX_DiscardUnknown() { + xxx_messageInfo_RPCEndpoint.DiscardUnknown(m) +} + +var xxx_messageInfo_RPCEndpoint proto.InternalMessageInfo + +func (m *RPCEndpoint) GetStarted() bool { + if m != nil { + return m.Started + } + return false +} + +func (m *RPCEndpoint) GetListenAddress() string { + if m != nil { + return m.ListenAddress + } + return "" +} + +type GetRPCEndpointsResponse struct { + Endpoints map[string]*RPCEndpoint `protobuf:"bytes,1,rep,name=endpoints,proto3" json:"endpoints,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetRPCEndpointsResponse) Reset() { *m = GetRPCEndpointsResponse{} } +func (m *GetRPCEndpointsResponse) String() string { return proto.CompactTextString(m) } +func (*GetRPCEndpointsResponse) ProtoMessage() {} +func (*GetRPCEndpointsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{10} +} + +func (m *GetRPCEndpointsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_GetRPCEndpointsResponse.Unmarshal(m, b) +} +func (m *GetRPCEndpointsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_GetRPCEndpointsResponse.Marshal(b, m, deterministic) +} +func (m *GetRPCEndpointsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRPCEndpointsResponse.Merge(m, src) +} +func (m *GetRPCEndpointsResponse) XXX_Size() int { + return xxx_messageInfo_GetRPCEndpointsResponse.Size(m) +} +func (m *GetRPCEndpointsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_GetRPCEndpointsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_GetRPCEndpointsResponse proto.InternalMessageInfo + +func (m *GetRPCEndpointsResponse) GetEndpoints() map[string]*RPCEndpoint { + if m != nil { + return m.Endpoints + } + return nil +} + type GenericExchangeNameRequest struct { Exchange string `protobuf:"bytes,1,opt,name=exchange,proto3" json:"exchange,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -136,7 +472,7 @@ func (m *GenericExchangeNameRequest) Reset() { *m = GenericExchangeNameR func (m *GenericExchangeNameRequest) String() string { return proto.CompactTextString(m) } func (*GenericExchangeNameRequest) ProtoMessage() {} func (*GenericExchangeNameRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{2} + return fileDescriptor_77a6da22d6a3feb1, []int{11} } func (m *GenericExchangeNameRequest) XXX_Unmarshal(b []byte) error { @@ -174,7 +510,7 @@ func (m *GenericExchangeNameResponse) Reset() { *m = GenericExchangeName func (m *GenericExchangeNameResponse) String() string { return proto.CompactTextString(m) } func (*GenericExchangeNameResponse) ProtoMessage() {} func (*GenericExchangeNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{3} + return fileDescriptor_77a6da22d6a3feb1, []int{12} } func (m *GenericExchangeNameResponse) XXX_Unmarshal(b []byte) error { @@ -206,7 +542,7 @@ func (m *GetExchangesRequest) Reset() { *m = GetExchangesRequest{} } func (m *GetExchangesRequest) String() string { return proto.CompactTextString(m) } func (*GetExchangesRequest) ProtoMessage() {} func (*GetExchangesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{4} + return fileDescriptor_77a6da22d6a3feb1, []int{13} } func (m *GetExchangesRequest) XXX_Unmarshal(b []byte) error { @@ -245,7 +581,7 @@ func (m *GetExchangesResponse) Reset() { *m = GetExchangesResponse{} } func (m *GetExchangesResponse) String() string { return proto.CompactTextString(m) } func (*GetExchangesResponse) ProtoMessage() {} func (*GetExchangesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{5} + return fileDescriptor_77a6da22d6a3feb1, []int{14} } func (m *GetExchangesResponse) XXX_Unmarshal(b []byte) error { @@ -284,7 +620,7 @@ func (m *GetExchangeOTPReponse) Reset() { *m = GetExchangeOTPReponse{} } func (m *GetExchangeOTPReponse) String() string { return proto.CompactTextString(m) } func (*GetExchangeOTPReponse) ProtoMessage() {} func (*GetExchangeOTPReponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{6} + return fileDescriptor_77a6da22d6a3feb1, []int{15} } func (m *GetExchangeOTPReponse) XXX_Unmarshal(b []byte) error { @@ -322,7 +658,7 @@ func (m *GetExchangeOTPsRequest) Reset() { *m = GetExchangeOTPsRequest{} func (m *GetExchangeOTPsRequest) String() string { return proto.CompactTextString(m) } func (*GetExchangeOTPsRequest) ProtoMessage() {} func (*GetExchangeOTPsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{7} + return fileDescriptor_77a6da22d6a3feb1, []int{16} } func (m *GetExchangeOTPsRequest) XXX_Unmarshal(b []byte) error { @@ -354,7 +690,7 @@ func (m *GetExchangeOTPsResponse) Reset() { *m = GetExchangeOTPsResponse func (m *GetExchangeOTPsResponse) String() string { return proto.CompactTextString(m) } func (*GetExchangeOTPsResponse) ProtoMessage() {} func (*GetExchangeOTPsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{8} + return fileDescriptor_77a6da22d6a3feb1, []int{17} } func (m *GetExchangeOTPsResponse) XXX_Unmarshal(b []byte) error { @@ -393,7 +729,7 @@ func (m *DisableExchangeRequest) Reset() { *m = DisableExchangeRequest{} func (m *DisableExchangeRequest) String() string { return proto.CompactTextString(m) } func (*DisableExchangeRequest) ProtoMessage() {} func (*DisableExchangeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{9} + return fileDescriptor_77a6da22d6a3feb1, []int{18} } func (m *DisableExchangeRequest) XXX_Unmarshal(b []byte) error { @@ -443,7 +779,7 @@ func (m *GetExchangeInfoResponse) Reset() { *m = GetExchangeInfoResponse func (m *GetExchangeInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetExchangeInfoResponse) ProtoMessage() {} func (*GetExchangeInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{10} + return fileDescriptor_77a6da22d6a3feb1, []int{19} } func (m *GetExchangeInfoResponse) XXX_Unmarshal(b []byte) error { @@ -561,7 +897,7 @@ func (m *GetTickerRequest) Reset() { *m = GetTickerRequest{} } func (m *GetTickerRequest) String() string { return proto.CompactTextString(m) } func (*GetTickerRequest) ProtoMessage() {} func (*GetTickerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{11} + return fileDescriptor_77a6da22d6a3feb1, []int{20} } func (m *GetTickerRequest) XXX_Unmarshal(b []byte) error { @@ -616,7 +952,7 @@ func (m *CurrencyPair) Reset() { *m = CurrencyPair{} } func (m *CurrencyPair) String() string { return proto.CompactTextString(m) } func (*CurrencyPair) ProtoMessage() {} func (*CurrencyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{12} + return fileDescriptor_77a6da22d6a3feb1, []int{21} } func (m *CurrencyPair) XXX_Unmarshal(b []byte) error { @@ -678,7 +1014,7 @@ func (m *TickerResponse) Reset() { *m = TickerResponse{} } func (m *TickerResponse) String() string { return proto.CompactTextString(m) } func (*TickerResponse) ProtoMessage() {} func (*TickerResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{13} + return fileDescriptor_77a6da22d6a3feb1, []int{22} } func (m *TickerResponse) XXX_Unmarshal(b []byte) error { @@ -779,7 +1115,7 @@ func (m *GetTickersRequest) Reset() { *m = GetTickersRequest{} } func (m *GetTickersRequest) String() string { return proto.CompactTextString(m) } func (*GetTickersRequest) ProtoMessage() {} func (*GetTickersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{14} + return fileDescriptor_77a6da22d6a3feb1, []int{23} } func (m *GetTickersRequest) XXX_Unmarshal(b []byte) error { @@ -812,7 +1148,7 @@ func (m *Tickers) Reset() { *m = Tickers{} } func (m *Tickers) String() string { return proto.CompactTextString(m) } func (*Tickers) ProtoMessage() {} func (*Tickers) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{15} + return fileDescriptor_77a6da22d6a3feb1, []int{24} } func (m *Tickers) XXX_Unmarshal(b []byte) error { @@ -858,7 +1194,7 @@ func (m *GetTickersResponse) Reset() { *m = GetTickersResponse{} } func (m *GetTickersResponse) String() string { return proto.CompactTextString(m) } func (*GetTickersResponse) ProtoMessage() {} func (*GetTickersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{16} + return fileDescriptor_77a6da22d6a3feb1, []int{25} } func (m *GetTickersResponse) XXX_Unmarshal(b []byte) error { @@ -899,7 +1235,7 @@ func (m *GetOrderbookRequest) Reset() { *m = GetOrderbookRequest{} } func (m *GetOrderbookRequest) String() string { return proto.CompactTextString(m) } func (*GetOrderbookRequest) ProtoMessage() {} func (*GetOrderbookRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{17} + return fileDescriptor_77a6da22d6a3feb1, []int{26} } func (m *GetOrderbookRequest) XXX_Unmarshal(b []byte) error { @@ -954,7 +1290,7 @@ func (m *OrderbookItem) Reset() { *m = OrderbookItem{} } func (m *OrderbookItem) String() string { return proto.CompactTextString(m) } func (*OrderbookItem) ProtoMessage() {} func (*OrderbookItem) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{18} + return fileDescriptor_77a6da22d6a3feb1, []int{27} } func (m *OrderbookItem) XXX_Unmarshal(b []byte) error { @@ -1012,7 +1348,7 @@ func (m *OrderbookResponse) Reset() { *m = OrderbookResponse{} } func (m *OrderbookResponse) String() string { return proto.CompactTextString(m) } func (*OrderbookResponse) ProtoMessage() {} func (*OrderbookResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{19} + return fileDescriptor_77a6da22d6a3feb1, []int{28} } func (m *OrderbookResponse) XXX_Unmarshal(b []byte) error { @@ -1085,7 +1421,7 @@ func (m *GetOrderbooksRequest) Reset() { *m = GetOrderbooksRequest{} } func (m *GetOrderbooksRequest) String() string { return proto.CompactTextString(m) } func (*GetOrderbooksRequest) ProtoMessage() {} func (*GetOrderbooksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{20} + return fileDescriptor_77a6da22d6a3feb1, []int{29} } func (m *GetOrderbooksRequest) XXX_Unmarshal(b []byte) error { @@ -1118,7 +1454,7 @@ func (m *Orderbooks) Reset() { *m = Orderbooks{} } func (m *Orderbooks) String() string { return proto.CompactTextString(m) } func (*Orderbooks) ProtoMessage() {} func (*Orderbooks) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{21} + return fileDescriptor_77a6da22d6a3feb1, []int{30} } func (m *Orderbooks) XXX_Unmarshal(b []byte) error { @@ -1164,7 +1500,7 @@ func (m *GetOrderbooksResponse) Reset() { *m = GetOrderbooksResponse{} } func (m *GetOrderbooksResponse) String() string { return proto.CompactTextString(m) } func (*GetOrderbooksResponse) ProtoMessage() {} func (*GetOrderbooksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{22} + return fileDescriptor_77a6da22d6a3feb1, []int{31} } func (m *GetOrderbooksResponse) XXX_Unmarshal(b []byte) error { @@ -1203,7 +1539,7 @@ func (m *GetAccountInfoRequest) Reset() { *m = GetAccountInfoRequest{} } func (m *GetAccountInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountInfoRequest) ProtoMessage() {} func (*GetAccountInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{23} + return fileDescriptor_77a6da22d6a3feb1, []int{32} } func (m *GetAccountInfoRequest) XXX_Unmarshal(b []byte) error { @@ -1243,7 +1579,7 @@ func (m *Account) Reset() { *m = Account{} } func (m *Account) String() string { return proto.CompactTextString(m) } func (*Account) ProtoMessage() {} func (*Account) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{24} + return fileDescriptor_77a6da22d6a3feb1, []int{33} } func (m *Account) XXX_Unmarshal(b []byte) error { @@ -1291,7 +1627,7 @@ func (m *AccountCurrencyInfo) Reset() { *m = AccountCurrencyInfo{} } func (m *AccountCurrencyInfo) String() string { return proto.CompactTextString(m) } func (*AccountCurrencyInfo) ProtoMessage() {} func (*AccountCurrencyInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{25} + return fileDescriptor_77a6da22d6a3feb1, []int{34} } func (m *AccountCurrencyInfo) XXX_Unmarshal(b []byte) error { @@ -1345,7 +1681,7 @@ func (m *GetAccountInfoResponse) Reset() { *m = GetAccountInfoResponse{} func (m *GetAccountInfoResponse) String() string { return proto.CompactTextString(m) } func (*GetAccountInfoResponse) ProtoMessage() {} func (*GetAccountInfoResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{26} + return fileDescriptor_77a6da22d6a3feb1, []int{35} } func (m *GetAccountInfoResponse) XXX_Unmarshal(b []byte) error { @@ -1390,7 +1726,7 @@ func (m *GetConfigRequest) Reset() { *m = GetConfigRequest{} } func (m *GetConfigRequest) String() string { return proto.CompactTextString(m) } func (*GetConfigRequest) ProtoMessage() {} func (*GetConfigRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{27} + return fileDescriptor_77a6da22d6a3feb1, []int{36} } func (m *GetConfigRequest) XXX_Unmarshal(b []byte) error { @@ -1422,7 +1758,7 @@ func (m *GetConfigResponse) Reset() { *m = GetConfigResponse{} } func (m *GetConfigResponse) String() string { return proto.CompactTextString(m) } func (*GetConfigResponse) ProtoMessage() {} func (*GetConfigResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{28} + return fileDescriptor_77a6da22d6a3feb1, []int{37} } func (m *GetConfigResponse) XXX_Unmarshal(b []byte) error { @@ -1464,7 +1800,7 @@ func (m *PortfolioAddress) Reset() { *m = PortfolioAddress{} } func (m *PortfolioAddress) String() string { return proto.CompactTextString(m) } func (*PortfolioAddress) ProtoMessage() {} func (*PortfolioAddress) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{29} + return fileDescriptor_77a6da22d6a3feb1, []int{38} } func (m *PortfolioAddress) XXX_Unmarshal(b []byte) error { @@ -1523,7 +1859,7 @@ func (m *GetPortfolioRequest) Reset() { *m = GetPortfolioRequest{} } func (m *GetPortfolioRequest) String() string { return proto.CompactTextString(m) } func (*GetPortfolioRequest) ProtoMessage() {} func (*GetPortfolioRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{30} + return fileDescriptor_77a6da22d6a3feb1, []int{39} } func (m *GetPortfolioRequest) XXX_Unmarshal(b []byte) error { @@ -1555,7 +1891,7 @@ func (m *GetPortfolioResponse) Reset() { *m = GetPortfolioResponse{} } func (m *GetPortfolioResponse) String() string { return proto.CompactTextString(m) } func (*GetPortfolioResponse) ProtoMessage() {} func (*GetPortfolioResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{31} + return fileDescriptor_77a6da22d6a3feb1, []int{40} } func (m *GetPortfolioResponse) XXX_Unmarshal(b []byte) error { @@ -1593,7 +1929,7 @@ func (m *GetPortfolioSummaryRequest) Reset() { *m = GetPortfolioSummaryR func (m *GetPortfolioSummaryRequest) String() string { return proto.CompactTextString(m) } func (*GetPortfolioSummaryRequest) ProtoMessage() {} func (*GetPortfolioSummaryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{32} + return fileDescriptor_77a6da22d6a3feb1, []int{41} } func (m *GetPortfolioSummaryRequest) XXX_Unmarshal(b []byte) error { @@ -1628,7 +1964,7 @@ func (m *Coin) Reset() { *m = Coin{} } func (m *Coin) String() string { return proto.CompactTextString(m) } func (*Coin) ProtoMessage() {} func (*Coin) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{33} + return fileDescriptor_77a6da22d6a3feb1, []int{42} } func (m *Coin) XXX_Unmarshal(b []byte) error { @@ -1690,7 +2026,7 @@ func (m *OfflineCoinSummary) Reset() { *m = OfflineCoinSummary{} } func (m *OfflineCoinSummary) String() string { return proto.CompactTextString(m) } func (*OfflineCoinSummary) ProtoMessage() {} func (*OfflineCoinSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{34} + return fileDescriptor_77a6da22d6a3feb1, []int{43} } func (m *OfflineCoinSummary) XXX_Unmarshal(b []byte) error { @@ -1744,7 +2080,7 @@ func (m *OnlineCoinSummary) Reset() { *m = OnlineCoinSummary{} } func (m *OnlineCoinSummary) String() string { return proto.CompactTextString(m) } func (*OnlineCoinSummary) ProtoMessage() {} func (*OnlineCoinSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{35} + return fileDescriptor_77a6da22d6a3feb1, []int{44} } func (m *OnlineCoinSummary) XXX_Unmarshal(b []byte) error { @@ -1790,7 +2126,7 @@ func (m *OfflineCoins) Reset() { *m = OfflineCoins{} } func (m *OfflineCoins) String() string { return proto.CompactTextString(m) } func (*OfflineCoins) ProtoMessage() {} func (*OfflineCoins) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{36} + return fileDescriptor_77a6da22d6a3feb1, []int{45} } func (m *OfflineCoins) XXX_Unmarshal(b []byte) error { @@ -1829,7 +2165,7 @@ func (m *OnlineCoins) Reset() { *m = OnlineCoins{} } func (m *OnlineCoins) String() string { return proto.CompactTextString(m) } func (*OnlineCoins) ProtoMessage() {} func (*OnlineCoins) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{37} + return fileDescriptor_77a6da22d6a3feb1, []int{46} } func (m *OnlineCoins) XXX_Unmarshal(b []byte) error { @@ -1872,7 +2208,7 @@ func (m *GetPortfolioSummaryResponse) Reset() { *m = GetPortfolioSummary func (m *GetPortfolioSummaryResponse) String() string { return proto.CompactTextString(m) } func (*GetPortfolioSummaryResponse) ProtoMessage() {} func (*GetPortfolioSummaryResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{38} + return fileDescriptor_77a6da22d6a3feb1, []int{47} } func (m *GetPortfolioSummaryResponse) XXX_Unmarshal(b []byte) error { @@ -1942,7 +2278,7 @@ func (m *AddPortfolioAddressRequest) Reset() { *m = AddPortfolioAddressR func (m *AddPortfolioAddressRequest) String() string { return proto.CompactTextString(m) } func (*AddPortfolioAddressRequest) ProtoMessage() {} func (*AddPortfolioAddressRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{39} + return fileDescriptor_77a6da22d6a3feb1, []int{48} } func (m *AddPortfolioAddressRequest) XXX_Unmarshal(b []byte) error { @@ -2001,7 +2337,7 @@ func (m *AddPortfolioAddressResponse) Reset() { *m = AddPortfolioAddress func (m *AddPortfolioAddressResponse) String() string { return proto.CompactTextString(m) } func (*AddPortfolioAddressResponse) ProtoMessage() {} func (*AddPortfolioAddressResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{40} + return fileDescriptor_77a6da22d6a3feb1, []int{49} } func (m *AddPortfolioAddressResponse) XXX_Unmarshal(b []byte) error { @@ -2035,7 +2371,7 @@ func (m *RemovePortfolioAddressRequest) Reset() { *m = RemovePortfolioAd func (m *RemovePortfolioAddressRequest) String() string { return proto.CompactTextString(m) } func (*RemovePortfolioAddressRequest) ProtoMessage() {} func (*RemovePortfolioAddressRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{41} + return fileDescriptor_77a6da22d6a3feb1, []int{50} } func (m *RemovePortfolioAddressRequest) XXX_Unmarshal(b []byte) error { @@ -2087,7 +2423,7 @@ func (m *RemovePortfolioAddressResponse) Reset() { *m = RemovePortfolioA func (m *RemovePortfolioAddressResponse) String() string { return proto.CompactTextString(m) } func (*RemovePortfolioAddressResponse) ProtoMessage() {} func (*RemovePortfolioAddressResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{42} + return fileDescriptor_77a6da22d6a3feb1, []int{51} } func (m *RemovePortfolioAddressResponse) XXX_Unmarshal(b []byte) error { @@ -2118,7 +2454,7 @@ func (m *GetForexProvidersRequest) Reset() { *m = GetForexProvidersReque func (m *GetForexProvidersRequest) String() string { return proto.CompactTextString(m) } func (*GetForexProvidersRequest) ProtoMessage() {} func (*GetForexProvidersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{43} + return fileDescriptor_77a6da22d6a3feb1, []int{52} } func (m *GetForexProvidersRequest) XXX_Unmarshal(b []byte) error { @@ -2156,7 +2492,7 @@ func (m *ForexProvider) Reset() { *m = ForexProvider{} } func (m *ForexProvider) String() string { return proto.CompactTextString(m) } func (*ForexProvider) ProtoMessage() {} func (*ForexProvider) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{44} + return fileDescriptor_77a6da22d6a3feb1, []int{53} } func (m *ForexProvider) XXX_Unmarshal(b []byte) error { @@ -2237,7 +2573,7 @@ func (m *GetForexProvidersResponse) Reset() { *m = GetForexProvidersResp func (m *GetForexProvidersResponse) String() string { return proto.CompactTextString(m) } func (*GetForexProvidersResponse) ProtoMessage() {} func (*GetForexProvidersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{45} + return fileDescriptor_77a6da22d6a3feb1, []int{54} } func (m *GetForexProvidersResponse) XXX_Unmarshal(b []byte) error { @@ -2275,7 +2611,7 @@ func (m *GetForexRatesRequest) Reset() { *m = GetForexRatesRequest{} } func (m *GetForexRatesRequest) String() string { return proto.CompactTextString(m) } func (*GetForexRatesRequest) ProtoMessage() {} func (*GetForexRatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{46} + return fileDescriptor_77a6da22d6a3feb1, []int{55} } func (m *GetForexRatesRequest) XXX_Unmarshal(b []byte) error { @@ -2310,7 +2646,7 @@ func (m *ForexRatesConversion) Reset() { *m = ForexRatesConversion{} } func (m *ForexRatesConversion) String() string { return proto.CompactTextString(m) } func (*ForexRatesConversion) ProtoMessage() {} func (*ForexRatesConversion) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{47} + return fileDescriptor_77a6da22d6a3feb1, []int{56} } func (m *ForexRatesConversion) XXX_Unmarshal(b []byte) error { @@ -2370,7 +2706,7 @@ func (m *GetForexRatesResponse) Reset() { *m = GetForexRatesResponse{} } func (m *GetForexRatesResponse) String() string { return proto.CompactTextString(m) } func (*GetForexRatesResponse) ProtoMessage() {} func (*GetForexRatesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{48} + return fileDescriptor_77a6da22d6a3feb1, []int{57} } func (m *GetForexRatesResponse) XXX_Unmarshal(b []byte) error { @@ -2420,7 +2756,7 @@ func (m *OrderDetails) Reset() { *m = OrderDetails{} } func (m *OrderDetails) String() string { return proto.CompactTextString(m) } func (*OrderDetails) ProtoMessage() {} func (*OrderDetails) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{49} + return fileDescriptor_77a6da22d6a3feb1, []int{58} } func (m *OrderDetails) XXX_Unmarshal(b []byte) error { @@ -2538,7 +2874,7 @@ func (m *GetOrdersRequest) Reset() { *m = GetOrdersRequest{} } func (m *GetOrdersRequest) String() string { return proto.CompactTextString(m) } func (*GetOrdersRequest) ProtoMessage() {} func (*GetOrdersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{50} + return fileDescriptor_77a6da22d6a3feb1, []int{59} } func (m *GetOrdersRequest) XXX_Unmarshal(b []byte) error { @@ -2591,7 +2927,7 @@ func (m *GetOrdersResponse) Reset() { *m = GetOrdersResponse{} } func (m *GetOrdersResponse) String() string { return proto.CompactTextString(m) } func (*GetOrdersResponse) ProtoMessage() {} func (*GetOrdersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{51} + return fileDescriptor_77a6da22d6a3feb1, []int{60} } func (m *GetOrdersResponse) XXX_Unmarshal(b []byte) error { @@ -2631,7 +2967,7 @@ func (m *GetOrderRequest) Reset() { *m = GetOrderRequest{} } func (m *GetOrderRequest) String() string { return proto.CompactTextString(m) } func (*GetOrderRequest) ProtoMessage() {} func (*GetOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{52} + return fileDescriptor_77a6da22d6a3feb1, []int{61} } func (m *GetOrderRequest) XXX_Unmarshal(b []byte) error { @@ -2683,7 +3019,7 @@ func (m *SubmitOrderRequest) Reset() { *m = SubmitOrderRequest{} } func (m *SubmitOrderRequest) String() string { return proto.CompactTextString(m) } func (*SubmitOrderRequest) ProtoMessage() {} func (*SubmitOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{53} + return fileDescriptor_77a6da22d6a3feb1, []int{62} } func (m *SubmitOrderRequest) XXX_Unmarshal(b []byte) error { @@ -2765,7 +3101,7 @@ func (m *SubmitOrderResponse) Reset() { *m = SubmitOrderResponse{} } func (m *SubmitOrderResponse) String() string { return proto.CompactTextString(m) } func (*SubmitOrderResponse) ProtoMessage() {} func (*SubmitOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{54} + return fileDescriptor_77a6da22d6a3feb1, []int{63} } func (m *SubmitOrderResponse) XXX_Unmarshal(b []byte) error { @@ -2817,7 +3153,7 @@ func (m *CancelOrderRequest) Reset() { *m = CancelOrderRequest{} } func (m *CancelOrderRequest) String() string { return proto.CompactTextString(m) } func (*CancelOrderRequest) ProtoMessage() {} func (*CancelOrderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{55} + return fileDescriptor_77a6da22d6a3feb1, []int{64} } func (m *CancelOrderRequest) XXX_Unmarshal(b []byte) error { @@ -2897,7 +3233,7 @@ func (m *CancelOrderResponse) Reset() { *m = CancelOrderResponse{} } func (m *CancelOrderResponse) String() string { return proto.CompactTextString(m) } func (*CancelOrderResponse) ProtoMessage() {} func (*CancelOrderResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{56} + return fileDescriptor_77a6da22d6a3feb1, []int{65} } func (m *CancelOrderResponse) XXX_Unmarshal(b []byte) error { @@ -2929,7 +3265,7 @@ func (m *CancelAllOrdersRequest) Reset() { *m = CancelAllOrdersRequest{} func (m *CancelAllOrdersRequest) String() string { return proto.CompactTextString(m) } func (*CancelAllOrdersRequest) ProtoMessage() {} func (*CancelAllOrdersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{57} + return fileDescriptor_77a6da22d6a3feb1, []int{66} } func (m *CancelAllOrdersRequest) XXX_Unmarshal(b []byte) error { @@ -2968,7 +3304,7 @@ func (m *CancelAllOrdersResponse) Reset() { *m = CancelAllOrdersResponse func (m *CancelAllOrdersResponse) String() string { return proto.CompactTextString(m) } func (*CancelAllOrdersResponse) ProtoMessage() {} func (*CancelAllOrdersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{58} + return fileDescriptor_77a6da22d6a3feb1, []int{67} } func (m *CancelAllOrdersResponse) XXX_Unmarshal(b []byte) error { @@ -3008,7 +3344,7 @@ func (m *CancelAllOrdersResponse_Orders) Reset() { *m = CancelAllOrdersR func (m *CancelAllOrdersResponse_Orders) String() string { return proto.CompactTextString(m) } func (*CancelAllOrdersResponse_Orders) ProtoMessage() {} func (*CancelAllOrdersResponse_Orders) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{58, 0} + return fileDescriptor_77a6da22d6a3feb1, []int{67, 0} } func (m *CancelAllOrdersResponse_Orders) XXX_Unmarshal(b []byte) error { @@ -3053,7 +3389,7 @@ func (m *GetEventsRequest) Reset() { *m = GetEventsRequest{} } func (m *GetEventsRequest) String() string { return proto.CompactTextString(m) } func (*GetEventsRequest) ProtoMessage() {} func (*GetEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{59} + return fileDescriptor_77a6da22d6a3feb1, []int{68} } func (m *GetEventsRequest) XXX_Unmarshal(b []byte) error { @@ -3089,7 +3425,7 @@ func (m *ConditionParams) Reset() { *m = ConditionParams{} } func (m *ConditionParams) String() string { return proto.CompactTextString(m) } func (*ConditionParams) ProtoMessage() {} func (*ConditionParams) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{60} + return fileDescriptor_77a6da22d6a3feb1, []int{69} } func (m *ConditionParams) XXX_Unmarshal(b []byte) error { @@ -3162,7 +3498,7 @@ func (m *GetEventsResponse) Reset() { *m = GetEventsResponse{} } func (m *GetEventsResponse) String() string { return proto.CompactTextString(m) } func (*GetEventsResponse) ProtoMessage() {} func (*GetEventsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{61} + return fileDescriptor_77a6da22d6a3feb1, []int{70} } func (m *GetEventsResponse) XXX_Unmarshal(b []byte) error { @@ -3248,7 +3584,7 @@ func (m *AddEventRequest) Reset() { *m = AddEventRequest{} } func (m *AddEventRequest) String() string { return proto.CompactTextString(m) } func (*AddEventRequest) ProtoMessage() {} func (*AddEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{62} + return fileDescriptor_77a6da22d6a3feb1, []int{71} } func (m *AddEventRequest) XXX_Unmarshal(b []byte) error { @@ -3322,7 +3658,7 @@ func (m *AddEventResponse) Reset() { *m = AddEventResponse{} } func (m *AddEventResponse) String() string { return proto.CompactTextString(m) } func (*AddEventResponse) ProtoMessage() {} func (*AddEventResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{63} + return fileDescriptor_77a6da22d6a3feb1, []int{72} } func (m *AddEventResponse) XXX_Unmarshal(b []byte) error { @@ -3361,7 +3697,7 @@ func (m *RemoveEventRequest) Reset() { *m = RemoveEventRequest{} } func (m *RemoveEventRequest) String() string { return proto.CompactTextString(m) } func (*RemoveEventRequest) ProtoMessage() {} func (*RemoveEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{64} + return fileDescriptor_77a6da22d6a3feb1, []int{73} } func (m *RemoveEventRequest) XXX_Unmarshal(b []byte) error { @@ -3399,7 +3735,7 @@ func (m *RemoveEventResponse) Reset() { *m = RemoveEventResponse{} } func (m *RemoveEventResponse) String() string { return proto.CompactTextString(m) } func (*RemoveEventResponse) ProtoMessage() {} func (*RemoveEventResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{65} + return fileDescriptor_77a6da22d6a3feb1, []int{74} } func (m *RemoveEventResponse) XXX_Unmarshal(b []byte) error { @@ -3433,7 +3769,7 @@ func (m *GetCryptocurrencyDepositAddressesRequest) Reset() { func (m *GetCryptocurrencyDepositAddressesRequest) String() string { return proto.CompactTextString(m) } func (*GetCryptocurrencyDepositAddressesRequest) ProtoMessage() {} func (*GetCryptocurrencyDepositAddressesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{66} + return fileDescriptor_77a6da22d6a3feb1, []int{75} } func (m *GetCryptocurrencyDepositAddressesRequest) XXX_Unmarshal(b []byte) error { @@ -3474,7 +3810,7 @@ func (m *GetCryptocurrencyDepositAddressesResponse) Reset() { func (m *GetCryptocurrencyDepositAddressesResponse) String() string { return proto.CompactTextString(m) } func (*GetCryptocurrencyDepositAddressesResponse) ProtoMessage() {} func (*GetCryptocurrencyDepositAddressesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{67} + return fileDescriptor_77a6da22d6a3feb1, []int{76} } func (m *GetCryptocurrencyDepositAddressesResponse) XXX_Unmarshal(b []byte) error { @@ -3516,7 +3852,7 @@ func (m *GetCryptocurrencyDepositAddressRequest) Reset() { func (m *GetCryptocurrencyDepositAddressRequest) String() string { return proto.CompactTextString(m) } func (*GetCryptocurrencyDepositAddressRequest) ProtoMessage() {} func (*GetCryptocurrencyDepositAddressRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{68} + return fileDescriptor_77a6da22d6a3feb1, []int{77} } func (m *GetCryptocurrencyDepositAddressRequest) XXX_Unmarshal(b []byte) error { @@ -3564,7 +3900,7 @@ func (m *GetCryptocurrencyDepositAddressResponse) Reset() { func (m *GetCryptocurrencyDepositAddressResponse) String() string { return proto.CompactTextString(m) } func (*GetCryptocurrencyDepositAddressResponse) ProtoMessage() {} func (*GetCryptocurrencyDepositAddressResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{69} + return fileDescriptor_77a6da22d6a3feb1, []int{78} } func (m *GetCryptocurrencyDepositAddressResponse) XXX_Unmarshal(b []byte) error { @@ -3619,7 +3955,7 @@ func (m *WithdrawCurrencyRequest) Reset() { *m = WithdrawCurrencyRequest func (m *WithdrawCurrencyRequest) String() string { return proto.CompactTextString(m) } func (*WithdrawCurrencyRequest) ProtoMessage() {} func (*WithdrawCurrencyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{70} + return fileDescriptor_77a6da22d6a3feb1, []int{79} } func (m *WithdrawCurrencyRequest) XXX_Unmarshal(b []byte) error { @@ -3770,7 +4106,7 @@ func (m *WithdrawResponse) Reset() { *m = WithdrawResponse{} } func (m *WithdrawResponse) String() string { return proto.CompactTextString(m) } func (*WithdrawResponse) ProtoMessage() {} func (*WithdrawResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{71} + return fileDescriptor_77a6da22d6a3feb1, []int{80} } func (m *WithdrawResponse) XXX_Unmarshal(b []byte) error { @@ -3801,6 +4137,19 @@ func (m *WithdrawResponse) GetResult() string { func init() { proto.RegisterType((*GetInfoRequest)(nil), "gctrpc.GetInfoRequest") proto.RegisterType((*GetInfoResponse)(nil), "gctrpc.GetInfoResponse") + proto.RegisterMapType((map[string]*RPCEndpoint)(nil), "gctrpc.GetInfoResponse.RpcEndpointsEntry") + proto.RegisterMapType((map[string]bool)(nil), "gctrpc.GetInfoResponse.SubsystemStatusEntry") + proto.RegisterType((*GetCommunicationRelayersRequest)(nil), "gctrpc.GetCommunicationRelayersRequest") + proto.RegisterType((*GetCommunicationRelayersResponse)(nil), "gctrpc.GetCommunicationRelayersResponse") + proto.RegisterType((*GenericSubsystemRequest)(nil), "gctrpc.GenericSubsystemRequest") + proto.RegisterType((*GenericSubsystemResponse)(nil), "gctrpc.GenericSubsystemResponse") + proto.RegisterType((*GetSubsystemsRequest)(nil), "gctrpc.GetSubsystemsRequest") + proto.RegisterType((*GetSusbsytemsResponse)(nil), "gctrpc.GetSusbsytemsResponse") + proto.RegisterMapType((map[string]bool)(nil), "gctrpc.GetSusbsytemsResponse.SubsystemsStatusEntry") + proto.RegisterType((*GetRPCEndpointsRequest)(nil), "gctrpc.GetRPCEndpointsRequest") + proto.RegisterType((*RPCEndpoint)(nil), "gctrpc.RPCEndpoint") + proto.RegisterType((*GetRPCEndpointsResponse)(nil), "gctrpc.GetRPCEndpointsResponse") + proto.RegisterMapType((map[string]*RPCEndpoint)(nil), "gctrpc.GetRPCEndpointsResponse.EndpointsEntry") proto.RegisterType((*GenericExchangeNameRequest)(nil), "gctrpc.GenericExchangeNameRequest") proto.RegisterType((*GenericExchangeNameResponse)(nil), "gctrpc.GenericExchangeNameResponse") proto.RegisterType((*GetExchangesRequest)(nil), "gctrpc.GetExchangesRequest") @@ -3883,232 +4232,255 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 3585 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3a, 0x4b, 0x6f, 0xe4, 0xc6, - 0xd1, 0xe0, 0xe8, 0x5d, 0x33, 0xd2, 0x8c, 0x5a, 0xaf, 0xd1, 0x48, 0xda, 0x07, 0xfd, 0xed, 0x7a, - 0x77, 0x6d, 0x4b, 0xf6, 0x7a, 0xf1, 0x7d, 0xfe, 0x6c, 0xc7, 0x89, 0xac, 0x7d, 0x78, 0xe3, 0xd8, - 0x2b, 0x70, 0xd7, 0x6b, 0xc0, 0x0e, 0x32, 0xa0, 0xc8, 0x1e, 0x89, 0x10, 0x45, 0xd2, 0x64, 0x8f, - 0xb4, 0x32, 0x02, 0x04, 0x30, 0x90, 0x6b, 0x72, 0x08, 0x12, 0xe4, 0x90, 0x53, 0x8e, 0x01, 0x72, - 0xc9, 0x0f, 0x30, 0x72, 0x0d, 0x72, 0xcc, 0x25, 0x3f, 0x20, 0xc8, 0x2d, 0x09, 0x72, 0xc8, 0x25, - 0xa7, 0xa0, 0xab, 0x1f, 0x64, 0x0f, 0x39, 0xa3, 0xd9, 0x38, 0xf1, 0x45, 0x1a, 0x56, 0x57, 0xd7, - 0xbb, 0xab, 0xab, 0x8a, 0x84, 0xb9, 0x34, 0xf1, 0xb6, 0x93, 0x34, 0x66, 0x31, 0x99, 0x3e, 0xf4, - 0x58, 0x9a, 0x78, 0x9d, 0xcd, 0xc3, 0x38, 0x3e, 0x0c, 0xe9, 0x8e, 0x9b, 0x04, 0x3b, 0x6e, 0x14, - 0xc5, 0xcc, 0x65, 0x41, 0x1c, 0x65, 0x02, 0xcb, 0x6e, 0xc1, 0xc2, 0x03, 0xca, 0x1e, 0x46, 0xbd, - 0xd8, 0xa1, 0x9f, 0xf5, 0x69, 0xc6, 0xec, 0xbf, 0x5b, 0xd0, 0xd4, 0xa0, 0x2c, 0x89, 0xa3, 0x8c, - 0x92, 0x55, 0x98, 0xee, 0x27, 0x2c, 0x38, 0xa1, 0x6d, 0xeb, 0x8a, 0x75, 0x63, 0xce, 0x91, 0x4f, - 0x64, 0x07, 0x96, 0xdc, 0x53, 0x37, 0x08, 0xdd, 0x83, 0x90, 0x76, 0xe9, 0x33, 0xef, 0xc8, 0x8d, - 0x0e, 0x69, 0xd6, 0xae, 0x5d, 0xb1, 0x6e, 0x4c, 0x38, 0x44, 0x2f, 0xdd, 0x53, 0x2b, 0xe4, 0x25, - 0x58, 0xa4, 0x11, 0x07, 0xf9, 0x05, 0xf4, 0x09, 0x44, 0x6f, 0xc9, 0x85, 0x1c, 0xf9, 0x0e, 0xac, - 0xfa, 0xb4, 0xe7, 0xf6, 0x43, 0xd6, 0xed, 0xc5, 0x29, 0x7d, 0xd6, 0x4d, 0xd2, 0xf8, 0x34, 0xf0, - 0x69, 0xda, 0x9e, 0x44, 0x29, 0x96, 0xe5, 0xea, 0x7d, 0xbe, 0xb8, 0x2f, 0xd7, 0xc8, 0x6d, 0x58, - 0xd1, 0xbb, 0x02, 0x97, 0x75, 0xbd, 0x7e, 0x9a, 0xd2, 0xc8, 0x3b, 0x6f, 0x4f, 0xe1, 0xa6, 0x25, - 0xb5, 0x29, 0x70, 0xd9, 0x9e, 0x5c, 0xb2, 0xdf, 0x80, 0xce, 0x03, 0x1a, 0xd1, 0x34, 0xf0, 0x14, - 0xf7, 0x0f, 0xdd, 0x13, 0x2a, 0x2d, 0x42, 0x3a, 0x30, 0xab, 0x84, 0x95, 0xfa, 0xeb, 0x67, 0x7b, - 0x0b, 0x36, 0x2a, 0x77, 0x0a, 0xc3, 0xd9, 0x3b, 0xb0, 0xf4, 0x80, 0x32, 0xad, 0x92, 0xa2, 0xd8, - 0x86, 0x19, 0xa9, 0x2d, 0x12, 0x9c, 0x75, 0xd4, 0xa3, 0x7d, 0x07, 0x96, 0xcd, 0x0d, 0xd2, 0x03, - 0x9b, 0x30, 0x97, 0x1b, 0x4c, 0x08, 0x91, 0x03, 0xec, 0xdb, 0xb0, 0x52, 0xd8, 0xf5, 0xe8, 0xc9, - 0xbe, 0x43, 0xc5, 0xb6, 0x75, 0x98, 0x8d, 0x59, 0xd2, 0xf5, 0x62, 0x5f, 0x89, 0x3e, 0x13, 0xb3, - 0x64, 0x2f, 0xf6, 0xa9, 0xdd, 0x86, 0x55, 0x73, 0x8f, 0x92, 0xce, 0xfe, 0xa5, 0x05, 0x6b, 0xa5, - 0x25, 0x29, 0xc7, 0xb7, 0x61, 0x4e, 0x11, 0xe4, 0x72, 0x4c, 0xdc, 0xa8, 0xdf, 0x7e, 0x65, 0x5b, - 0x44, 0xda, 0xf6, 0x90, 0x3d, 0xdb, 0x8f, 0x04, 0xc7, 0xec, 0x5e, 0xc4, 0xd2, 0x73, 0x67, 0x56, - 0x0a, 0x90, 0x75, 0xde, 0x82, 0x79, 0x63, 0x89, 0xb4, 0x60, 0xe2, 0x98, 0x9e, 0x4b, 0x41, 0xf9, - 0x4f, 0xb2, 0x0c, 0x53, 0xa7, 0x6e, 0xd8, 0xa7, 0x18, 0x52, 0x73, 0x8e, 0x78, 0x78, 0xb3, 0xf6, - 0x86, 0x65, 0xdf, 0x81, 0xd5, 0xbb, 0x41, 0x56, 0x8c, 0xae, 0x71, 0xdc, 0xf5, 0xe5, 0x84, 0xa1, - 0x9a, 0x11, 0xe4, 0x04, 0x26, 0x23, 0x57, 0x87, 0x38, 0xfe, 0x2e, 0x3a, 0xaa, 0x66, 0x38, 0x8a, - 0xaf, 0x9c, 0xd2, 0xf4, 0x20, 0xce, 0x28, 0xc6, 0xef, 0xac, 0xa3, 0x1e, 0xc9, 0x0b, 0x30, 0xdf, - 0xcf, 0x82, 0xe8, 0xb0, 0x9b, 0xb9, 0x91, 0x7f, 0x10, 0x3f, 0xc3, 0x68, 0x9d, 0x75, 0x1a, 0x08, - 0x7c, 0x2c, 0x60, 0xe4, 0x2a, 0x34, 0x8e, 0x18, 0x4b, 0xba, 0xfc, 0x18, 0xc5, 0x7d, 0x26, 0x83, - 0xb3, 0xce, 0x61, 0x4f, 0x04, 0x88, 0x5c, 0x83, 0x05, 0x44, 0xe9, 0x67, 0x34, 0x75, 0x0f, 0x69, - 0xc4, 0xda, 0xd3, 0x88, 0x34, 0xcf, 0xa1, 0x1f, 0x29, 0x20, 0xd9, 0x02, 0x40, 0xb4, 0x24, 0x8d, - 0x9f, 0x9d, 0xb7, 0x67, 0x44, 0x68, 0x70, 0xc8, 0x3e, 0x07, 0x90, 0x17, 0xa1, 0x79, 0xe0, 0x66, - 0x54, 0x1d, 0x83, 0x80, 0x66, 0xed, 0x59, 0xc4, 0x59, 0xe0, 0xe0, 0x3d, 0x0d, 0x25, 0x37, 0xa1, - 0x95, 0xf5, 0x93, 0x24, 0x4e, 0x19, 0xf5, 0xbb, 0x6e, 0x96, 0x51, 0x96, 0xb5, 0xe7, 0x10, 0xb3, - 0xa9, 0xe1, 0xbb, 0x08, 0xe6, 0x1a, 0xaa, 0x53, 0x9c, 0xb8, 0x41, 0x9a, 0xb5, 0x01, 0xf1, 0x1a, - 0x12, 0xb8, 0xcf, 0x61, 0x9c, 0x71, 0x9e, 0x1b, 0x04, 0x5a, 0x5d, 0x30, 0xd6, 0x60, 0x81, 0xf8, - 0x12, 0x2c, 0xba, 0x7d, 0x76, 0x44, 0x23, 0x16, 0x78, 0x2e, 0x32, 0x4f, 0x82, 0x76, 0x03, 0x6d, - 0xd6, 0x32, 0x16, 0x76, 0x93, 0xc0, 0x3e, 0x83, 0xd6, 0x03, 0xca, 0x9e, 0x04, 0xde, 0x31, 0x4d, - 0xc7, 0x70, 0x38, 0xb9, 0x01, 0x93, 0x9c, 0x37, 0x7a, 0xaf, 0x7e, 0x7b, 0x59, 0x85, 0xaa, 0x3a, - 0xf9, 0x5c, 0x02, 0x07, 0x31, 0xb8, 0x1d, 0x51, 0xeb, 0x2e, 0x3b, 0x4f, 0x84, 0x4f, 0xe7, 0x9c, - 0x39, 0x84, 0x3c, 0x39, 0x4f, 0xa8, 0xfd, 0x14, 0x1a, 0xc5, 0x4d, 0xfc, 0x40, 0xfa, 0x34, 0x0c, - 0x4e, 0x02, 0x46, 0x53, 0x75, 0x20, 0x35, 0x80, 0xc7, 0x12, 0x37, 0xaf, 0x0c, 0x5b, 0xfc, 0xcd, - 0x63, 0xf9, 0xb3, 0x7e, 0xcc, 0x14, 0x6d, 0xf1, 0x60, 0xff, 0xb4, 0x06, 0x0b, 0x4a, 0x1d, 0x19, - 0x88, 0x4a, 0x66, 0xeb, 0x42, 0x99, 0xaf, 0x42, 0x23, 0x74, 0x33, 0xd6, 0xed, 0x27, 0x3e, 0x37, - 0x90, 0x4c, 0xbc, 0x75, 0x0e, 0xfb, 0x48, 0x80, 0xb8, 0xaf, 0x54, 0x06, 0x44, 0x2f, 0x48, 0xee, - 0x0d, 0xaf, 0xa8, 0x0c, 0x81, 0x49, 0xbe, 0x07, 0x23, 0xd5, 0x72, 0xf0, 0x37, 0x87, 0x1d, 0x05, - 0x87, 0x47, 0x18, 0x99, 0x96, 0x83, 0xbf, 0xf9, 0x01, 0x0d, 0xe3, 0x33, 0x8c, 0x43, 0xcb, 0xe1, - 0x3f, 0x39, 0xe4, 0x20, 0xf0, 0x31, 0xec, 0x2c, 0x87, 0xff, 0xe4, 0x10, 0x37, 0x3b, 0xc6, 0x20, - 0xb3, 0x1c, 0xfe, 0x93, 0xdf, 0x1e, 0xa7, 0x71, 0xd8, 0x3f, 0xa1, 0x18, 0x4f, 0x96, 0x23, 0x9f, - 0xc8, 0x06, 0xcc, 0x25, 0x69, 0xe0, 0xd1, 0xae, 0xcb, 0x8e, 0x30, 0x84, 0x2c, 0x67, 0x16, 0x01, - 0xbb, 0xec, 0xc8, 0x5e, 0x82, 0x45, 0xed, 0x68, 0x9d, 0x99, 0x3e, 0x86, 0x19, 0x09, 0x19, 0xe9, - 0xf4, 0x57, 0x61, 0x86, 0x09, 0xb4, 0x76, 0x0d, 0x53, 0xd4, 0xaa, 0xb2, 0xa1, 0x69, 0x69, 0x47, - 0xa1, 0xd9, 0xdf, 0x04, 0x52, 0xe4, 0x26, 0x1d, 0x71, 0x33, 0xa7, 0x23, 0x52, 0x5d, 0xd3, 0xa4, - 0x93, 0xe5, 0x04, 0x3e, 0xc7, 0x44, 0xff, 0x28, 0xf5, 0x79, 0x12, 0x88, 0x8f, 0xbf, 0xd6, 0xd0, - 0xfc, 0x00, 0xe6, 0x35, 0xe3, 0x87, 0x8c, 0x9e, 0x70, 0x83, 0xbb, 0x27, 0x71, 0x3f, 0x62, 0xc8, - 0xd3, 0x72, 0xe4, 0x13, 0x8f, 0x40, 0xb4, 0x2f, 0xb2, 0xb4, 0x1c, 0xf1, 0x40, 0x16, 0xa0, 0x16, - 0xf8, 0xf2, 0x12, 0xae, 0x05, 0xbe, 0xfd, 0x4f, 0x0b, 0x16, 0x0b, 0x8a, 0x3c, 0x77, 0x50, 0x96, - 0x22, 0xae, 0x56, 0x11, 0x71, 0x37, 0x61, 0xf2, 0x20, 0xf0, 0xf9, 0xdd, 0xcf, 0xed, 0xba, 0xa2, - 0xc8, 0x19, 0x7a, 0x38, 0x88, 0xc2, 0x51, 0xdd, 0xec, 0x38, 0x6b, 0x4f, 0x8e, 0x44, 0xe5, 0x28, - 0xa5, 0xf3, 0x30, 0x55, 0x3e, 0x0f, 0xa6, 0x2d, 0xa7, 0x07, 0x6d, 0xb9, 0x8a, 0xf7, 0xaf, 0xa6, - 0xad, 0x23, 0xcf, 0x03, 0xc8, 0x81, 0x23, 0xdd, 0xfa, 0xff, 0x00, 0xb1, 0xc6, 0x94, 0xf1, 0xb7, - 0x5e, 0x12, 0x5a, 0x87, 0x60, 0x01, 0xd9, 0x7e, 0x1f, 0xaf, 0xf1, 0x22, 0x73, 0x69, 0xfc, 0xdb, - 0x06, 0x4d, 0x11, 0x8b, 0xa4, 0x44, 0x33, 0x33, 0x88, 0xbd, 0x8e, 0xc4, 0x76, 0x3d, 0x8f, 0xbb, - 0xbe, 0x50, 0xe0, 0x8d, 0xbc, 0x1f, 0x9f, 0xc2, 0x8c, 0xdc, 0x21, 0xc3, 0x42, 0x20, 0xd4, 0x02, - 0x9f, 0xbc, 0x05, 0x50, 0xb8, 0x43, 0x84, 0x5e, 0x1b, 0x4a, 0x06, 0xb9, 0x49, 0x45, 0x03, 0xb2, - 0x2b, 0xa0, 0xdb, 0x3d, 0x58, 0xaa, 0x40, 0xe1, 0xa2, 0xe8, 0xf2, 0x4c, 0x8a, 0xa2, 0x9e, 0xc9, - 0x65, 0xa8, 0xb3, 0x98, 0xb9, 0x61, 0x37, 0x2f, 0x00, 0x2c, 0x07, 0x10, 0xf4, 0x94, 0x43, 0x30, - 0x41, 0xc5, 0xa1, 0x88, 0x5c, 0x9e, 0xa0, 0xe2, 0xd0, 0xb7, 0x5d, 0x2c, 0x6a, 0x0c, 0xa5, 0xa5, - 0x09, 0x47, 0xb9, 0xec, 0x25, 0x98, 0x75, 0xc5, 0x16, 0xa5, 0x58, 0x73, 0x40, 0x31, 0x47, 0x23, - 0xd8, 0x04, 0x6f, 0xa0, 0xbd, 0x38, 0xea, 0x05, 0x87, 0x2a, 0x3a, 0x5e, 0xc4, 0x64, 0xa5, 0x60, - 0x79, 0x3d, 0xe1, 0xbb, 0xcc, 0x45, 0x6e, 0x0d, 0x07, 0x7f, 0xdb, 0x3f, 0xb4, 0xa0, 0xb5, 0x1f, - 0xa7, 0xac, 0x17, 0x87, 0x41, 0xbc, 0xeb, 0xfb, 0x29, 0xcd, 0x32, 0x5e, 0x4a, 0xb8, 0xe2, 0xa7, - 0xaa, 0xd1, 0xe4, 0x23, 0xcf, 0x90, 0x5e, 0x1c, 0x44, 0x22, 0x56, 0x6b, 0xd2, 0x40, 0x71, 0x10, - 0xf1, 0x50, 0x25, 0x57, 0xa0, 0xee, 0xd3, 0xcc, 0x4b, 0x83, 0x84, 0x17, 0xf4, 0x32, 0x2d, 0x14, - 0x41, 0x9c, 0xf0, 0x81, 0x1b, 0xba, 0x91, 0x47, 0x65, 0x66, 0x57, 0x8f, 0xf6, 0x0a, 0xa6, 0x2b, - 0x2d, 0x89, 0xd2, 0xe3, 0x43, 0x8c, 0xfe, 0x02, 0x58, 0xaa, 0xf2, 0xbf, 0x30, 0x97, 0x28, 0xa0, - 0x0c, 0xbf, 0xb6, 0xb2, 0xd0, 0xa0, 0x3a, 0x4e, 0x8e, 0x6a, 0x6f, 0xf2, 0xba, 0x3a, 0xa7, 0xf7, - 0xb8, 0x7f, 0x72, 0xe2, 0xa6, 0xe7, 0x8a, 0x5b, 0x04, 0x93, 0x7b, 0x71, 0x10, 0x71, 0x43, 0x71, - 0xa5, 0x54, 0xe1, 0xc5, 0x7f, 0x17, 0x45, 0xaf, 0x19, 0xa2, 0x17, 0xad, 0x35, 0x61, 0x5a, 0xeb, - 0x12, 0x40, 0x42, 0x53, 0x8f, 0x46, 0xcc, 0x3d, 0x54, 0x1a, 0x17, 0x20, 0xf6, 0x11, 0x90, 0x47, - 0xbd, 0x5e, 0x18, 0x44, 0x94, 0xb3, 0x95, 0xc2, 0x8c, 0xb0, 0xfe, 0x70, 0x19, 0x4c, 0x4e, 0x13, - 0x25, 0x4e, 0x1f, 0xc0, 0xe2, 0xa3, 0xa8, 0x82, 0x91, 0x22, 0x67, 0x8d, 0x22, 0x57, 0x2b, 0x91, - 0x7b, 0x0f, 0x1a, 0x05, 0xc1, 0x33, 0xf2, 0x06, 0xcc, 0x49, 0x19, 0x75, 0x11, 0xde, 0xd1, 0xd9, - 0xa0, 0xa4, 0xa1, 0x93, 0x23, 0xdb, 0x3f, 0xb7, 0xa0, 0x9e, 0x4b, 0xc6, 0x5b, 0xac, 0x29, 0x6e, - 0x6e, 0x45, 0xe5, 0x92, 0xa6, 0x92, 0xe3, 0x6c, 0xe3, 0x5f, 0x51, 0xbb, 0x0b, 0xe4, 0xce, 0x63, - 0x80, 0x1c, 0x58, 0x51, 0xb5, 0xef, 0x14, 0xab, 0xf6, 0x62, 0xf6, 0x1b, 0xb4, 0x49, 0xb1, 0xa0, - 0xff, 0xfd, 0x24, 0x6f, 0xa5, 0x2a, 0x82, 0x45, 0xc6, 0xe0, 0x2b, 0x50, 0x17, 0x67, 0x81, 0x67, - 0x00, 0x25, 0x70, 0x43, 0xdf, 0x43, 0x71, 0x10, 0x39, 0x80, 0x67, 0x03, 0xd7, 0xc9, 0x6b, 0x30, - 0x8f, 0xc2, 0x76, 0x63, 0x61, 0x10, 0x79, 0xb0, 0xcd, 0x0d, 0x0d, 0x44, 0x91, 0x26, 0x23, 0x09, - 0xac, 0x18, 0x5b, 0xba, 0x99, 0x10, 0x41, 0x5e, 0x52, 0x6f, 0x17, 0xfa, 0x9c, 0x61, 0x52, 0x0a, - 0x63, 0x49, 0x82, 0x72, 0x4d, 0x98, 0x6e, 0xc9, 0x2b, 0xaf, 0x90, 0x1d, 0x68, 0x48, 0x8e, 0x68, - 0x19, 0x79, 0xc5, 0x99, 0x32, 0xd6, 0xc5, 0x46, 0x44, 0x20, 0x27, 0xb0, 0x5c, 0xdc, 0xa0, 0x25, - 0x9c, 0xc2, 0x8d, 0x6f, 0x8d, 0x2f, 0x61, 0x54, 0x12, 0x90, 0x78, 0xa5, 0x85, 0xce, 0x77, 0xa1, - 0x3d, 0x4c, 0xa1, 0x0a, 0xb7, 0xdf, 0x32, 0xdd, 0xbe, 0x5c, 0x11, 0x92, 0x59, 0xc1, 0xe3, 0x9d, - 0x4f, 0x60, 0x6d, 0x88, 0x30, 0x15, 0xc4, 0x6f, 0x9a, 0xc4, 0x97, 0x2a, 0x22, 0xb5, 0x18, 0x4d, - 0x3f, 0xb6, 0xa0, 0xb3, 0xeb, 0xfb, 0xa5, 0xe4, 0x94, 0x37, 0xe0, 0x5f, 0x77, 0xca, 0xdd, 0x82, - 0x8d, 0x4a, 0x81, 0xe4, 0xa4, 0xe0, 0x19, 0x6c, 0x39, 0xf4, 0x24, 0x3e, 0xa5, 0x5f, 0xb7, 0xc8, - 0xf6, 0x15, 0xb8, 0x34, 0x8c, 0xb3, 0x94, 0xad, 0x03, 0xed, 0x07, 0xd4, 0x1c, 0xb3, 0xe8, 0xc2, - 0xe8, 0x2f, 0x16, 0xcc, 0x9b, 0x03, 0x98, 0xff, 0x54, 0x1f, 0xfd, 0x32, 0x90, 0x94, 0x66, 0xac, - 0x9b, 0xc6, 0x61, 0xc8, 0xdb, 0x69, 0x9f, 0x86, 0xee, 0xb9, 0x1c, 0xfd, 0xb4, 0xf8, 0x8a, 0x23, - 0x16, 0xee, 0x72, 0x38, 0x59, 0x83, 0x19, 0x37, 0x09, 0xba, 0x3c, 0x6a, 0x44, 0x2f, 0x3d, 0xed, - 0x26, 0xc1, 0xfb, 0xf4, 0x9c, 0xd8, 0x30, 0x2f, 0x17, 0xba, 0x21, 0x3d, 0xa5, 0x21, 0xd6, 0x7c, - 0x13, 0x4e, 0x5d, 0x2c, 0x7f, 0x87, 0x83, 0x78, 0xef, 0x9b, 0xa4, 0x01, 0x0f, 0xbf, 0x7c, 0xc6, - 0x34, 0x83, 0xd2, 0x34, 0x25, 0x5c, 0x69, 0x67, 0x7f, 0x0a, 0xeb, 0x15, 0xb6, 0x90, 0x39, 0xea, - 0x1d, 0x68, 0x9a, 0x93, 0x2a, 0x95, 0xa7, 0x74, 0xd5, 0x6a, 0x6c, 0x74, 0x16, 0x7a, 0x06, 0x1d, - 0x59, 0x7d, 0x22, 0x8e, 0xe3, 0x32, 0x3d, 0x2f, 0xb2, 0x3f, 0x83, 0xe5, 0x1c, 0xb8, 0x17, 0x47, - 0xa7, 0x34, 0xcd, 0x78, 0xb4, 0x11, 0x98, 0xec, 0xa5, 0xf1, 0x89, 0x32, 0x35, 0xff, 0xcd, 0xeb, - 0x36, 0x16, 0xcb, 0x30, 0xa8, 0xb1, 0x98, 0xe3, 0xa4, 0x2e, 0x53, 0xb7, 0x14, 0xfe, 0xe6, 0x75, - 0x72, 0x80, 0x44, 0x68, 0x17, 0xd7, 0x44, 0xa8, 0xd6, 0x25, 0x8c, 0x73, 0xb1, 0x9f, 0x62, 0xf9, - 0x58, 0x14, 0x45, 0xea, 0xf8, 0x0d, 0xa8, 0x0b, 0x1d, 0xf9, 0x4e, 0xa5, 0xdf, 0xa6, 0xa1, 0xdf, - 0x80, 0x98, 0x0e, 0xf4, 0x34, 0xd4, 0xfe, 0x5b, 0x0d, 0x1a, 0x58, 0xb1, 0xde, 0xa5, 0xcc, 0x0d, - 0xc2, 0xd1, 0xb5, 0xb4, 0xa8, 0x41, 0x6b, 0xba, 0x06, 0x7d, 0x01, 0xe6, 0x8b, 0xc3, 0x8c, 0x73, - 0xd5, 0xcc, 0x16, 0x46, 0x19, 0xe7, 0xe4, 0x1a, 0x2c, 0x60, 0x6b, 0x9d, 0x63, 0x89, 0x98, 0x99, - 0x47, 0xa8, 0x46, 0x33, 0x1b, 0x81, 0xa9, 0x81, 0x46, 0x80, 0x2f, 0x63, 0x31, 0xdd, 0xcd, 0x02, - 0x5f, 0xf7, 0x09, 0x08, 0x79, 0x1c, 0xf8, 0x85, 0x65, 0xdc, 0x3d, 0x53, 0x58, 0xc6, 0xdd, 0xbc, - 0x07, 0x4a, 0x29, 0x4e, 0x5a, 0x71, 0xc4, 0x83, 0xed, 0xf0, 0x84, 0xd3, 0x50, 0xc0, 0x27, 0xc1, - 0x09, 0x4e, 0x55, 0x33, 0xe6, 0xb2, 0xbe, 0x9a, 0xb3, 0xc8, 0xa7, 0xbc, 0x4d, 0x83, 0x62, 0x9b, - 0x96, 0x37, 0x75, 0x75, 0xa3, 0xa9, 0xbb, 0x0c, 0xf5, 0x38, 0xa1, 0x51, 0x57, 0xb6, 0xd8, 0x0d, - 0x51, 0x3d, 0x70, 0xd0, 0x53, 0x84, 0xc8, 0x91, 0x09, 0xda, 0x3c, 0x1b, 0xa7, 0x2f, 0x35, 0x0d, - 0x53, 0x1b, 0x34, 0x8c, 0x6a, 0x04, 0x27, 0x2e, 0x6a, 0x04, 0xed, 0x5d, 0xac, 0x8a, 0x15, 0x63, - 0x19, 0x3e, 0x2f, 0xc3, 0x34, 0x9a, 0x49, 0x45, 0xce, 0xb2, 0xd1, 0xc6, 0xc8, 0xa0, 0x70, 0x24, - 0x8e, 0xfd, 0x1e, 0xce, 0xa2, 0x71, 0x69, 0x1c, 0xd1, 0xd7, 0x61, 0x56, 0x78, 0x45, 0x47, 0xcd, - 0x0c, 0x3e, 0x3f, 0xf4, 0xed, 0x3f, 0x5a, 0x40, 0x1e, 0xf7, 0x0f, 0x4e, 0x82, 0xf1, 0xa9, 0x8d, - 0xdf, 0xa0, 0x13, 0x98, 0xc4, 0x30, 0x11, 0xe1, 0x88, 0xbf, 0x07, 0x22, 0x64, 0x72, 0x30, 0x42, - 0x72, 0x77, 0x4e, 0x55, 0xf7, 0xe8, 0xd3, 0x45, 0xe7, 0xf3, 0x14, 0x1f, 0x06, 0x34, 0x62, 0x5d, - 0x39, 0x6c, 0xe1, 0x29, 0x1e, 0x01, 0x0f, 0x7d, 0xfb, 0x31, 0x2c, 0x19, 0x9a, 0x49, 0x4b, 0x5f, - 0x85, 0x86, 0x10, 0x20, 0x09, 0x5d, 0x4f, 0x4f, 0x9a, 0xeb, 0x08, 0xdb, 0x47, 0xd0, 0x28, 0x7b, - 0xfd, 0xd5, 0x02, 0xb2, 0xc7, 0x2f, 0xae, 0x70, 0x6c, 0x7b, 0xf1, 0xc0, 0x11, 0x5d, 0x52, 0x4e, - 0x6f, 0x4e, 0x42, 0x1e, 0x9a, 0xcc, 0x26, 0x0c, 0x66, 0xda, 0xd2, 0x93, 0xcf, 0x39, 0x0a, 0x29, - 0x9d, 0xda, 0x6b, 0xb0, 0x70, 0xe6, 0x86, 0x21, 0x65, 0x5d, 0x75, 0x57, 0xca, 0x99, 0xa9, 0x80, - 0xaa, 0x8e, 0x4b, 0xf9, 0x6b, 0x26, 0xf7, 0x17, 0x6f, 0x89, 0x0c, 0x7d, 0xe5, 0xdd, 0x77, 0x07, - 0x56, 0x05, 0x78, 0x37, 0x0c, 0xc7, 0x3e, 0x43, 0xf6, 0x2f, 0x6a, 0xb0, 0x56, 0xda, 0xa6, 0x2f, - 0x09, 0xf3, 0x04, 0x5c, 0xd7, 0xea, 0x56, 0x6f, 0xd8, 0x96, 0x8f, 0x72, 0x57, 0xe7, 0xb7, 0x16, - 0x4c, 0x0b, 0xd0, 0x48, 0x6f, 0x7c, 0xa2, 0xdc, 0x2f, 0x73, 0x8c, 0xa8, 0x7f, 0xff, 0x6f, 0x3c, - 0x66, 0xe2, 0xdf, 0x63, 0xdc, 0x29, 0xca, 0x43, 0x11, 0x37, 0x02, 0xd2, 0x79, 0x07, 0x5a, 0x83, - 0x08, 0xcf, 0x35, 0xbc, 0x17, 0x3d, 0xf4, 0xbd, 0x53, 0x1a, 0x31, 0x7d, 0xc7, 0x7d, 0x69, 0x41, - 0x73, 0x2f, 0x8e, 0xfc, 0x80, 0xe7, 0xc7, 0x7d, 0x37, 0x75, 0x4f, 0x32, 0xb2, 0xc9, 0x2b, 0x1b, - 0x09, 0x52, 0x43, 0x56, 0x0d, 0x18, 0x32, 0xce, 0xda, 0x02, 0xf0, 0x8e, 0xa8, 0x77, 0xdc, 0x95, - 0xf3, 0x25, 0x1e, 0xf4, 0x73, 0x08, 0x79, 0x37, 0xf0, 0x33, 0xf2, 0x0a, 0x2c, 0xe5, 0xcb, 0x5d, - 0x37, 0xf2, 0xbb, 0x72, 0xb8, 0x84, 0xf3, 0x66, 0x8d, 0xb7, 0x1b, 0xf9, 0xbb, 0xd9, 0x31, 0x4e, - 0xc5, 0xf5, 0x4c, 0xa5, 0x6b, 0x1c, 0xd8, 0xa6, 0x86, 0xef, 0x22, 0xd8, 0xfe, 0x87, 0x85, 0xf9, - 0x4e, 0x69, 0x25, 0xbd, 0x9d, 0x8f, 0x51, 0x70, 0xba, 0x66, 0xb8, 0xac, 0x36, 0xe0, 0x32, 0x02, - 0x93, 0x01, 0xa3, 0x27, 0x2a, 0x8d, 0xf0, 0xdf, 0xe4, 0x5d, 0x68, 0x69, 0x8d, 0xbb, 0x09, 0x9a, - 0x45, 0x1e, 0x93, 0xb5, 0xbc, 0x4d, 0x30, 0xac, 0xe6, 0x34, 0xbd, 0x01, 0x33, 0xaa, 0xe3, 0x35, - 0x75, 0xe1, 0xf1, 0xe2, 0x59, 0xc9, 0x43, 0x6b, 0x4f, 0xcb, 0x22, 0x0a, 0x9f, 0x84, 0xd4, 0xd4, - 0xeb, 0x33, 0xea, 0xcb, 0xc2, 0x48, 0x3f, 0xdb, 0x7f, 0xb6, 0xa0, 0xb9, 0xeb, 0xfb, 0xa8, 0xf7, - 0x38, 0x69, 0x42, 0x69, 0x59, 0xbb, 0x40, 0xcb, 0x89, 0x7f, 0x53, 0xcb, 0xaf, 0x9c, 0x44, 0x86, - 0x18, 0xc1, 0xb6, 0xa1, 0x95, 0xeb, 0x59, 0xed, 0x5e, 0xfb, 0x7f, 0x80, 0x88, 0x62, 0xda, 0x30, - 0xc7, 0x20, 0xd6, 0x0a, 0x2c, 0x19, 0x58, 0x32, 0xd7, 0xdc, 0x87, 0x1b, 0x0f, 0x28, 0xdb, 0x4b, - 0xcf, 0x13, 0x16, 0xab, 0xe2, 0xe5, 0x2e, 0x4d, 0xe2, 0x2c, 0x50, 0x99, 0x8b, 0x8e, 0x95, 0x7d, - 0x7e, 0x67, 0xc1, 0xcd, 0x31, 0x08, 0x49, 0x15, 0xbe, 0x57, 0x9e, 0x26, 0x7c, 0xab, 0xd0, 0x48, - 0x8e, 0x47, 0x65, 0x5b, 0x43, 0x44, 0xba, 0xc8, 0x49, 0x76, 0xde, 0x86, 0x05, 0x73, 0xf1, 0xb9, - 0x52, 0x45, 0x08, 0xd7, 0x2f, 0x10, 0x62, 0x9c, 0x98, 0xbb, 0x0e, 0x0b, 0x9e, 0x41, 0x42, 0x32, - 0x1a, 0x80, 0xda, 0x7b, 0xf0, 0xe2, 0x85, 0xdc, 0xa4, 0xd9, 0x86, 0xf6, 0x63, 0xf6, 0xaf, 0x27, - 0x61, 0xed, 0xe3, 0x80, 0x1d, 0xf9, 0xa9, 0x7b, 0xa6, 0xa2, 0x6f, 0x1c, 0x21, 0x07, 0x5a, 0xb5, - 0x5a, 0xb9, 0xbb, 0xbc, 0x05, 0x8b, 0x71, 0x44, 0xb1, 0xa2, 0xec, 0x26, 0x6e, 0x96, 0x9d, 0xc5, - 0xa9, 0xba, 0x4b, 0x9b, 0x71, 0x44, 0x79, 0x55, 0xb9, 0x2f, 0xc1, 0x03, 0xb7, 0xf1, 0xe4, 0xe0, - 0x6d, 0xdc, 0x82, 0x89, 0x24, 0x88, 0xe4, 0x84, 0x9c, 0xff, 0xe4, 0x77, 0x27, 0x4b, 0x5d, 0xbf, - 0x40, 0x59, 0xde, 0x9d, 0x08, 0xd5, 0x74, 0x8b, 0x33, 0xdb, 0x99, 0x81, 0x99, 0x6d, 0xc1, 0x26, - 0xb3, 0x66, 0x8f, 0x7a, 0x19, 0xea, 0xf2, 0x67, 0x97, 0xb9, 0x87, 0xb2, 0xe0, 0x05, 0x09, 0x7a, - 0xe2, 0x1e, 0x16, 0xea, 0x21, 0x30, 0xea, 0xa1, 0x2d, 0x80, 0x1e, 0xa5, 0x5d, 0xa3, 0xf4, 0x9d, - 0xeb, 0x51, 0x2a, 0x92, 0x2e, 0x2f, 0x8c, 0x0e, 0xdc, 0xe8, 0xb8, 0x8b, 0x1d, 0x67, 0x43, 0x88, - 0xc3, 0x01, 0x1f, 0xf2, 0xae, 0xf3, 0x2a, 0x34, 0x70, 0x51, 0xc9, 0x34, 0x2f, 0x2c, 0xca, 0x61, - 0xbb, 0x79, 0xef, 0x8c, 0x28, 0x5e, 0xc0, 0xce, 0xdb, 0x0b, 0xf9, 0xfe, 0xbd, 0x80, 0x9d, 0xeb, - 0xfd, 0x68, 0xb3, 0xf4, 0xbc, 0xdd, 0xcc, 0xf7, 0xef, 0x09, 0x10, 0x17, 0x2f, 0x3b, 0x0b, 0x7a, - 0x54, 0xbc, 0x62, 0x6f, 0x09, 0x2b, 0x23, 0x64, 0x2f, 0xf6, 0xb1, 0x0f, 0x38, 0x0b, 0xd2, 0x42, - 0x2b, 0xb2, 0x28, 0x1a, 0x16, 0x0e, 0xd4, 0x5f, 0x1f, 0xdc, 0x82, 0x96, 0x0a, 0x97, 0xe2, 0x17, - 0x17, 0x29, 0xcd, 0xfa, 0x21, 0x53, 0x5f, 0x5c, 0x88, 0xa7, 0xdb, 0x3f, 0xdb, 0x80, 0x85, 0x07, - 0xb1, 0x08, 0xd0, 0x27, 0xdc, 0x2f, 0x29, 0x79, 0x04, 0x33, 0xf2, 0x7b, 0x0d, 0xb2, 0x5a, 0x38, - 0xb7, 0x85, 0x91, 0x7f, 0x67, 0xad, 0x04, 0x97, 0x19, 0x67, 0xe9, 0x8b, 0x3f, 0xfc, 0xe9, 0x27, - 0xb5, 0x79, 0x52, 0xdf, 0x39, 0x7d, 0x6d, 0xe7, 0x90, 0xb2, 0x80, 0x53, 0xf1, 0xa0, 0x51, 0xfc, - 0x06, 0x81, 0x6c, 0x54, 0xbc, 0xe0, 0x57, 0xa7, 0xae, 0xb3, 0x59, 0xbd, 0x28, 0xe9, 0xb7, 0x91, - 0x3e, 0x21, 0x2d, 0x49, 0x5f, 0x7f, 0xb2, 0x40, 0x3e, 0x87, 0xe6, 0xc0, 0xfb, 0x7b, 0x62, 0xe7, - 0xa4, 0x86, 0x7d, 0x8b, 0xd1, 0x79, 0x61, 0x24, 0x8e, 0xe4, 0x7a, 0x09, 0xb9, 0xb6, 0xed, 0x25, - 0xce, 0xd5, 0x17, 0x5c, 0x14, 0xe7, 0x37, 0xad, 0x5b, 0x24, 0xc3, 0xae, 0xa2, 0xf8, 0x11, 0xc0, - 0x58, 0xbc, 0x2f, 0x57, 0xa8, 0x6a, 0x58, 0x73, 0x03, 0xf9, 0xae, 0x90, 0xa5, 0x01, 0x6d, 0xd1, - 0xaa, 0x19, 0xbe, 0x62, 0x2c, 0x7c, 0x20, 0x81, 0x01, 0x32, 0x0e, 0xdf, 0xad, 0xea, 0x0f, 0x2c, - 0xe4, 0x37, 0x1e, 0x76, 0x07, 0xb9, 0x2e, 0x13, 0x32, 0xc0, 0x35, 0x66, 0x09, 0xc9, 0x8c, 0xef, - 0x4f, 0x24, 0xd3, 0x8c, 0x5c, 0x1a, 0xfa, 0xc9, 0xc6, 0x70, 0x4d, 0x8b, 0x9f, 0x74, 0x0c, 0xd5, - 0x34, 0x66, 0x49, 0x46, 0x9e, 0xc1, 0xc2, 0xbd, 0xe8, 0xbf, 0xe3, 0xd9, 0x2d, 0xe4, 0xbb, 0x66, - 0xa3, 0xae, 0x62, 0x84, 0x54, 0x74, 0xec, 0xc7, 0x30, 0xa7, 0x5f, 0xe3, 0x92, 0x76, 0x41, 0x09, - 0xe3, 0x83, 0x81, 0xce, 0x90, 0xd7, 0xc1, 0x2a, 0x5a, 0xed, 0x79, 0xa9, 0x95, 0x78, 0xb9, 0xcb, - 0x09, 0x7f, 0x0a, 0x90, 0xbf, 0x1f, 0x26, 0xeb, 0x25, 0xca, 0xda, 0x72, 0x9d, 0xaa, 0x25, 0x49, - 0x7e, 0x15, 0xc9, 0xb7, 0xc8, 0x82, 0x41, 0x3e, 0x93, 0xe7, 0x4d, 0xbf, 0xc6, 0x33, 0xce, 0xdb, - 0xe0, 0x1b, 0xe5, 0xce, 0xf0, 0x57, 0x89, 0xca, 0x29, 0xb6, 0x3a, 0x6c, 0xba, 0x40, 0xe5, 0x1a, - 0x1c, 0xc2, 0xbc, 0xf1, 0x6e, 0x91, 0x6c, 0x56, 0x71, 0xc9, 0xaa, 0x62, 0xae, 0xfc, 0x42, 0xd2, - 0x5e, 0x47, 0x56, 0x4b, 0x64, 0x71, 0x90, 0x55, 0x46, 0x8e, 0xf1, 0x8b, 0xb2, 0xc2, 0x2b, 0x38, - 0x52, 0xa4, 0x55, 0x7e, 0x1f, 0xd9, 0xb9, 0x34, 0x6c, 0x39, 0xab, 0x8e, 0x6f, 0x79, 0x87, 0xe1, - 0xa1, 0x12, 0x0e, 0x17, 0x2f, 0xde, 0x0c, 0x87, 0x1b, 0xef, 0xe7, 0x3a, 0xeb, 0x15, 0x2b, 0x92, - 0xfa, 0x0a, 0x52, 0x6f, 0x12, 0xe5, 0x73, 0x4f, 0xd0, 0x12, 0x3e, 0xd1, 0x13, 0x51, 0xc3, 0x27, - 0x83, 0xaf, 0xcd, 0x8c, 0x1c, 0x58, 0x7a, 0x79, 0x56, 0xca, 0x81, 0xfa, 0xf5, 0x18, 0xf9, 0x81, - 0xf9, 0x16, 0x4e, 0xbd, 0x15, 0xb0, 0x47, 0x8e, 0xf1, 0x4b, 0xa7, 0x65, 0xe8, 0xa8, 0xdf, 0xbe, - 0x8c, 0x9c, 0xd7, 0xc9, 0xda, 0x20, 0x67, 0xf9, 0xda, 0x80, 0x7c, 0x61, 0xc1, 0x52, 0xc5, 0x50, - 0x3a, 0x97, 0x60, 0xf8, 0x08, 0x3d, 0x97, 0x60, 0xd4, 0x54, 0xdb, 0x46, 0x09, 0x36, 0x6d, 0x94, - 0xc0, 0xf5, 0x7d, 0x2d, 0x81, 0xbc, 0x92, 0x79, 0x64, 0xfe, 0xc8, 0x82, 0xd5, 0xea, 0x01, 0x34, - 0xb9, 0xa6, 0x78, 0x8c, 0x1c, 0x8d, 0x77, 0xae, 0x5f, 0x84, 0x26, 0xa5, 0xb9, 0x86, 0xd2, 0x5c, - 0xb6, 0x3b, 0x5c, 0x9a, 0x14, 0x71, 0xab, 0x04, 0x3a, 0xc3, 0x3e, 0xce, 0x1c, 0xf1, 0x92, 0x2b, - 0x05, 0x83, 0x57, 0x4e, 0xc2, 0x3b, 0x57, 0x47, 0x60, 0x98, 0xe9, 0x8b, 0xac, 0x48, 0x87, 0xe0, - 0x5c, 0x54, 0xcf, 0x8a, 0xe5, 0x19, 0xcd, 0x47, 0xa8, 0xc6, 0x19, 0x2d, 0x4d, 0x85, 0x8d, 0x33, - 0x5a, 0x1e, 0xd4, 0x96, 0xce, 0x28, 0x32, 0xc3, 0xa1, 0x2d, 0xf9, 0x04, 0x8f, 0x8d, 0x1c, 0x22, - 0xb4, 0x07, 0x8f, 0x7a, 0x56, 0x75, 0x6c, 0xcc, 0x31, 0x41, 0x29, 0x55, 0x8a, 0xd9, 0x04, 0xb7, - 0x9e, 0x03, 0xb3, 0x0a, 0x9d, 0xac, 0x0d, 0x12, 0x50, 0x94, 0x2b, 0xa7, 0x7e, 0xf6, 0x1a, 0x12, - 0x5d, 0xb4, 0x1b, 0x45, 0xa2, 0x9c, 0xe6, 0x01, 0xd4, 0x0b, 0x13, 0x2e, 0xa2, 0x93, 0x6c, 0x79, - 0xa0, 0xd7, 0xd9, 0xa8, 0x5c, 0x33, 0x53, 0x89, 0xdd, 0xe4, 0x0c, 0x32, 0x44, 0x28, 0xf2, 0x28, - 0xcc, 0x7f, 0x72, 0x1e, 0xe5, 0x21, 0x58, 0xce, 0xa3, 0x6a, 0x60, 0x64, 0xf0, 0xf0, 0x10, 0x41, - 0xf3, 0x48, 0xa1, 0x39, 0x30, 0x77, 0xc9, 0xaf, 0xe2, 0xea, 0x29, 0x53, 0x7e, 0x15, 0x0f, 0x19, - 0xd8, 0x98, 0xc5, 0x8e, 0xe0, 0xe7, 0x86, 0x61, 0xee, 0x0f, 0x91, 0x22, 0xc5, 0x54, 0xc2, 0xf0, - 0xb5, 0x31, 0x7e, 0x31, 0x7c, 0x6d, 0x8e, 0x30, 0x4a, 0x29, 0x92, 0x0a, 0x5a, 0x4f, 0x61, 0x56, - 0xb5, 0xc3, 0xb9, 0xa3, 0x07, 0x06, 0x01, 0x9d, 0x76, 0x79, 0x41, 0x52, 0x35, 0x9c, 0xed, 0xfa, - 0x3e, 0x52, 0x95, 0x8e, 0x28, 0x34, 0xc7, 0xb9, 0x23, 0xca, 0x7d, 0x75, 0xee, 0x88, 0xaa, 0x6e, - 0xda, 0x70, 0x84, 0x38, 0xed, 0x9a, 0xc7, 0x6f, 0x2c, 0xb8, 0x7a, 0x61, 0x6f, 0x4b, 0x5e, 0x7d, - 0x8e, 0x36, 0x58, 0x08, 0xf4, 0xda, 0x73, 0x37, 0xce, 0xf6, 0x0d, 0x14, 0xd3, 0xb6, 0xb7, 0xd4, - 0x05, 0x84, 0xdb, 0x7c, 0x81, 0xae, 0xbb, 0x68, 0x2e, 0xf4, 0xaf, 0x2c, 0xb8, 0x7c, 0x01, 0x5d, - 0xb2, 0x3d, 0xa6, 0x00, 0x4a, 0xe0, 0x9d, 0xb1, 0xf1, 0xa5, 0xb8, 0xd7, 0x51, 0xdc, 0x2b, 0xf6, - 0xc6, 0x08, 0x71, 0xb9, 0xb0, 0xdf, 0x87, 0x0d, 0xdd, 0x03, 0x1b, 0x74, 0xef, 0xf7, 0x23, 0x3f, - 0x23, 0x3a, 0xac, 0x87, 0x34, 0xca, 0x79, 0xe0, 0x0c, 0xb6, 0x46, 0xe6, 0x9d, 0x72, 0x26, 0x57, - 0x85, 0x18, 0x3d, 0x4e, 0x9b, 0x73, 0x4f, 0x60, 0x51, 0xed, 0xbb, 0x1f, 0xb8, 0xec, 0x2b, 0xf3, - 0xbc, 0x82, 0x3c, 0x3b, 0xf6, 0x4a, 0x91, 0x67, 0x2f, 0x70, 0x99, 0xe2, 0x78, 0x30, 0x8d, 0xdf, - 0xd3, 0xbf, 0xfe, 0xaf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x0a, 0xf2, 0x2b, 0x82, 0x2f, 0x00, - 0x00, + // 3962 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x3b, 0x4b, 0x6c, 0x24, 0x49, + 0x56, 0xca, 0xb2, 0xdb, 0x76, 0xbd, 0x2a, 0xbb, 0xec, 0xf0, 0xaf, 0x5c, 0xb6, 0xdb, 0xee, 0x1c, + 0xba, 0xa7, 0x7b, 0x3e, 0xf6, 0x4e, 0x4f, 0x8b, 0x1d, 0x76, 0x96, 0x05, 0x8f, 0xa7, 0xc7, 0xdb, + 0xec, 0xee, 0xb4, 0xc9, 0xee, 0xed, 0x91, 0x66, 0x11, 0x45, 0xba, 0x32, 0x6c, 0xa7, 0x9c, 0x95, + 0x99, 0x93, 0x19, 0x65, 0x77, 0xad, 0x90, 0x90, 0x56, 0xe2, 0x0a, 0x07, 0x84, 0xc4, 0x81, 0x13, + 0x47, 0x24, 0x2e, 0x88, 0x13, 0x87, 0x11, 0x57, 0xc4, 0x91, 0x0b, 0xdc, 0x11, 0x37, 0xe0, 0xc4, + 0x85, 0x13, 0x8a, 0x17, 0x9f, 0x8c, 0xa8, 0xcc, 0x2a, 0x57, 0xef, 0x8c, 0xe6, 0xd2, 0x5d, 0xf9, + 0xe2, 0xc5, 0x7b, 0x2f, 0xde, 0x7b, 0xf1, 0xe2, 0xbd, 0x17, 0x61, 0xa8, 0x67, 0x69, 0xef, 0x20, + 0xcd, 0x12, 0x96, 0x90, 0xb9, 0x8b, 0x1e, 0xcb, 0xd2, 0x5e, 0x67, 0xe7, 0x22, 0x49, 0x2e, 0x22, + 0x7a, 0xe8, 0xa7, 0xe1, 0xa1, 0x1f, 0xc7, 0x09, 0xf3, 0x59, 0x98, 0xc4, 0xb9, 0xc0, 0x72, 0x97, + 0x61, 0xe9, 0x84, 0xb2, 0x67, 0xf1, 0x79, 0xe2, 0xd1, 0xaf, 0x06, 0x34, 0x67, 0xee, 0x3f, 0xcc, + 0x42, 0x4b, 0x83, 0xf2, 0x34, 0x89, 0x73, 0x4a, 0x36, 0x60, 0x6e, 0x90, 0xb2, 0xb0, 0x4f, 0xdb, + 0xce, 0xbe, 0xf3, 0xb0, 0xee, 0xc9, 0x2f, 0x72, 0x08, 0xab, 0xfe, 0xb5, 0x1f, 0x46, 0xfe, 0x59, + 0x44, 0xbb, 0xf4, 0x75, 0xef, 0xd2, 0x8f, 0x2f, 0x68, 0xde, 0xae, 0xed, 0x3b, 0x0f, 0x67, 0x3c, + 0xa2, 0x87, 0x9e, 0xaa, 0x11, 0xf2, 0x2e, 0xac, 0xd0, 0x98, 0x83, 0x02, 0x03, 0x7d, 0x06, 0xd1, + 0x97, 0xe5, 0x40, 0x81, 0xfc, 0x04, 0x36, 0x02, 0x7a, 0xee, 0x0f, 0x22, 0xd6, 0x3d, 0x4f, 0x32, + 0xfa, 0xba, 0x9b, 0x66, 0xc9, 0x75, 0x18, 0xd0, 0xac, 0x3d, 0x8b, 0x52, 0xac, 0xc9, 0xd1, 0xcf, + 0xf8, 0xe0, 0xa9, 0x1c, 0x23, 0x8f, 0x61, 0x5d, 0xcf, 0x0a, 0x7d, 0xd6, 0xed, 0x0d, 0xb2, 0x8c, + 0xc6, 0xbd, 0x61, 0xfb, 0x0e, 0x4e, 0x5a, 0x55, 0x93, 0x42, 0x9f, 0x1d, 0xcb, 0x21, 0xf2, 0x05, + 0x2c, 0xe7, 0x83, 0xb3, 0x7c, 0x98, 0x33, 0xda, 0xef, 0xe6, 0xcc, 0x67, 0x83, 0xbc, 0x3d, 0xb7, + 0x3f, 0xf3, 0xb0, 0xf1, 0xf8, 0xbd, 0x03, 0xa1, 0xc6, 0x83, 0x11, 0x95, 0x1c, 0xbc, 0x50, 0xf8, + 0x2f, 0x10, 0xfd, 0x69, 0xcc, 0xb2, 0xa1, 0xd7, 0xca, 0x6d, 0x28, 0xf9, 0x1c, 0x16, 0xb3, 0xb4, + 0xd7, 0xa5, 0x71, 0x90, 0x26, 0x61, 0xcc, 0xf2, 0xf6, 0x3c, 0x52, 0x7d, 0x34, 0x8e, 0xaa, 0x97, + 0xf6, 0x9e, 0x2a, 0x5c, 0x41, 0xb2, 0x99, 0x19, 0xa0, 0xce, 0x27, 0xb0, 0x56, 0xc5, 0x98, 0x2c, + 0xc3, 0xcc, 0x15, 0x1d, 0x4a, 0xeb, 0xf0, 0x9f, 0x64, 0x0d, 0xee, 0x5c, 0xfb, 0xd1, 0x80, 0xa2, + 0x31, 0x16, 0x3c, 0xf1, 0xf1, 0x83, 0xda, 0x47, 0x4e, 0xe7, 0x25, 0xac, 0x94, 0xd8, 0x54, 0x10, + 0x78, 0x64, 0x12, 0x68, 0x3c, 0x5e, 0x55, 0x22, 0x7b, 0xa7, 0xc7, 0x6a, 0xae, 0x41, 0xd5, 0xbd, + 0x07, 0x7b, 0x27, 0x94, 0x1d, 0x27, 0xfd, 0xfe, 0x20, 0x0e, 0x7b, 0xe8, 0x63, 0x1e, 0x8d, 0xfc, + 0x21, 0xcd, 0x72, 0xe5, 0x59, 0x2e, 0xec, 0x8f, 0x47, 0x11, 0x0a, 0x70, 0xbf, 0x0f, 0x9b, 0x27, + 0x34, 0xa6, 0x59, 0xd8, 0xd3, 0xeb, 0x94, 0xd3, 0xc9, 0x0e, 0xd4, 0xb5, 0x7a, 0xa5, 0xa0, 0x05, + 0xc0, 0xed, 0x40, 0xbb, 0x3c, 0x51, 0x12, 0xdd, 0x80, 0xb5, 0x13, 0xca, 0x34, 0x5c, 0x0b, 0xf4, + 0xb5, 0x03, 0xeb, 0x38, 0x90, 0x9f, 0xe5, 0x43, 0x31, 0x20, 0x1d, 0xfe, 0x8f, 0x60, 0x45, 0x93, + 0xce, 0x95, 0x47, 0x38, 0x68, 0xbb, 0x0f, 0x0d, 0xdb, 0x95, 0x67, 0x16, 0x7e, 0x91, 0x9b, 0x8e, + 0x51, 0xb8, 0x97, 0x04, 0x77, 0x8e, 0x61, 0xbd, 0x12, 0xf5, 0x4d, 0x4c, 0xe9, 0xb6, 0x61, 0xe3, + 0x84, 0x32, 0xc3, 0x22, 0x7a, 0x69, 0x9f, 0x43, 0xc3, 0x00, 0x93, 0x36, 0xcc, 0xe7, 0xcc, 0xcf, + 0x18, 0x0d, 0x90, 0xf0, 0x82, 0xa7, 0x3e, 0xc9, 0x7d, 0x58, 0x8a, 0xc2, 0x9c, 0xd1, 0xb8, 0xeb, + 0x07, 0x41, 0x46, 0x73, 0xb1, 0x7b, 0xeb, 0xde, 0xa2, 0x80, 0x1e, 0x09, 0xa0, 0xfb, 0x8f, 0x0e, + 0x37, 0xcc, 0x08, 0x2b, 0xa9, 0xac, 0x9f, 0x42, 0xbd, 0x70, 0x70, 0xa1, 0xa4, 0x03, 0x43, 0x49, + 0x55, 0x73, 0x0e, 0x46, 0xbc, 0xbc, 0x20, 0xd0, 0xf9, 0x7d, 0x58, 0xfa, 0xb6, 0x7d, 0xf3, 0x23, + 0xe8, 0x48, 0xdf, 0x50, 0xc1, 0xe5, 0x73, 0xbf, 0x4f, 0x95, 0x5f, 0x75, 0x60, 0x41, 0xc5, 0x22, + 0xc9, 0x43, 0x7f, 0xbb, 0xbb, 0xb0, 0x5d, 0x39, 0x53, 0x3a, 0xd6, 0x21, 0xac, 0x9e, 0x50, 0xa6, + 0x23, 0x96, 0xa2, 0xd8, 0x86, 0x79, 0x19, 0xcc, 0x94, 0xb6, 0xe5, 0xa7, 0xfb, 0x04, 0x3d, 0xd1, + 0x98, 0x20, 0x55, 0xb8, 0x03, 0xf5, 0x22, 0x1e, 0x4a, 0xdf, 0xd6, 0x00, 0xf7, 0x31, 0xba, 0xa9, + 0x9a, 0xf5, 0xfc, 0xe5, 0xa9, 0x47, 0xc5, 0xb4, 0x2d, 0x58, 0x48, 0x58, 0xda, 0xed, 0x25, 0x81, + 0x12, 0x7d, 0x3e, 0x61, 0xe9, 0x71, 0x12, 0x50, 0xe9, 0x1a, 0xc6, 0x1c, 0xed, 0x1a, 0x7f, 0x23, + 0x4c, 0x69, 0x0f, 0x49, 0x39, 0x7e, 0x0f, 0xea, 0x8a, 0xa0, 0x32, 0xe5, 0xfb, 0x86, 0x29, 0xab, + 0xe6, 0x1c, 0x3c, 0x17, 0x1c, 0xa5, 0x25, 0x17, 0xa4, 0x00, 0x79, 0xe7, 0x63, 0x58, 0xb4, 0x86, + 0x6e, 0xf3, 0xec, 0xba, 0x69, 0xb2, 0x27, 0xb0, 0xf1, 0x69, 0x98, 0x9b, 0x87, 0xc7, 0x34, 0xe6, + 0xfa, 0x7a, 0xc6, 0x5a, 0x9a, 0x75, 0x86, 0x11, 0x98, 0x8d, 0x7d, 0x7d, 0x82, 0xe1, 0x6f, 0xd3, + 0x50, 0x35, 0xcb, 0x50, 0x7c, 0xe4, 0x9a, 0x66, 0x67, 0x49, 0x4e, 0xf1, 0x78, 0x5a, 0xf0, 0xd4, + 0x27, 0x79, 0x0b, 0x16, 0x07, 0x79, 0x18, 0x5f, 0x74, 0x73, 0x3f, 0x0e, 0xce, 0x92, 0xd7, 0x78, + 0x18, 0x2d, 0x78, 0x4d, 0x04, 0xbe, 0x10, 0x30, 0x72, 0x0f, 0x9a, 0x97, 0x8c, 0xa5, 0x5d, 0x7e, + 0x4a, 0x26, 0x03, 0x26, 0xcf, 0x9e, 0x06, 0x87, 0xbd, 0x14, 0x20, 0xbe, 0xf1, 0x10, 0x65, 0x90, + 0xd3, 0xcc, 0xbf, 0xa0, 0x31, 0x6b, 0xcf, 0x89, 0x8d, 0xc7, 0xa1, 0x3f, 0x57, 0x40, 0xb2, 0x0b, + 0x80, 0x68, 0x69, 0x96, 0xbc, 0x1e, 0xb6, 0xe7, 0x85, 0x6b, 0x70, 0xc8, 0x29, 0x07, 0x90, 0xb7, + 0xa1, 0x75, 0xe6, 0xe7, 0x54, 0x9d, 0x72, 0x21, 0xcd, 0xdb, 0x0b, 0x88, 0xb3, 0xc4, 0xc1, 0xc7, + 0x1a, 0x4a, 0x1e, 0xf1, 0x23, 0x2e, 0x4d, 0x13, 0xbe, 0xe9, 0xbb, 0x7e, 0x9e, 0x53, 0x96, 0xb7, + 0xeb, 0x88, 0xd9, 0xd2, 0xf0, 0x23, 0x04, 0xf3, 0x15, 0xaa, 0x43, 0x3a, 0xf5, 0xc3, 0x2c, 0x6f, + 0x03, 0xe2, 0x35, 0x25, 0xf0, 0x94, 0xc3, 0x38, 0xe3, 0xe2, 0xe8, 0x17, 0x68, 0x0d, 0xc1, 0x58, + 0x83, 0x05, 0xe2, 0xbb, 0xb0, 0xe2, 0x0f, 0xd8, 0x25, 0x8d, 0x19, 0x8f, 0xf9, 0x9c, 0x79, 0x1a, + 0xb6, 0x9b, 0xa8, 0xb3, 0x65, 0x6b, 0xe0, 0x28, 0x0d, 0xdd, 0x1b, 0x58, 0x3e, 0xa1, 0xec, 0x65, + 0xd8, 0xbb, 0xa2, 0xd9, 0x14, 0x06, 0x27, 0x0f, 0x61, 0x96, 0xf3, 0x96, 0x71, 0x60, 0x4d, 0xb9, + 0xaa, 0x3a, 0xd8, 0xb9, 0x04, 0x1e, 0x62, 0x70, 0x3d, 0xe2, 0xaa, 0xbb, 0x6c, 0x98, 0x0a, 0x9b, + 0xd6, 0xbd, 0x3a, 0x42, 0x5e, 0x0e, 0x53, 0xea, 0xbe, 0x82, 0xa6, 0x39, 0x89, 0x6f, 0xc8, 0x80, + 0x46, 0x61, 0x3f, 0x64, 0x34, 0x53, 0x1b, 0x52, 0x03, 0xb8, 0x2f, 0x71, 0xf5, 0x4a, 0xb7, 0xc5, + 0xdf, 0xdc, 0x97, 0xbf, 0x1a, 0x24, 0x4c, 0xd1, 0x16, 0x1f, 0xee, 0x5f, 0xd6, 0x60, 0x49, 0x2d, + 0x47, 0x3a, 0xa2, 0x92, 0xd9, 0xb9, 0x55, 0xe6, 0x7b, 0xd0, 0x8c, 0xfc, 0x9c, 0x75, 0x07, 0x69, + 0xc0, 0x15, 0x24, 0xf3, 0xaa, 0x06, 0x87, 0xfd, 0x5c, 0x80, 0xb8, 0xad, 0x54, 0x82, 0x83, 0x56, + 0x90, 0xdc, 0x9b, 0x3d, 0x73, 0x31, 0x04, 0x66, 0xf9, 0x1c, 0xf4, 0x54, 0xc7, 0xc3, 0xdf, 0x1c, + 0x76, 0x19, 0x5e, 0x5c, 0xa2, 0x67, 0x3a, 0x1e, 0xfe, 0xe6, 0x1b, 0x34, 0x4a, 0x6e, 0xd0, 0x0f, + 0x1d, 0x8f, 0xff, 0xe4, 0x90, 0xb3, 0x30, 0x40, 0xb7, 0x73, 0x3c, 0xfe, 0x93, 0x43, 0xfc, 0xfc, + 0x0a, 0x9d, 0xcc, 0xf1, 0xf8, 0x4f, 0x9e, 0x1c, 0x5e, 0x27, 0xd1, 0xa0, 0x4f, 0xd1, 0x9f, 0x1c, + 0x4f, 0x7e, 0x91, 0x6d, 0xa8, 0xa7, 0x59, 0xd8, 0xa3, 0x5d, 0x9f, 0x5d, 0xa2, 0x0b, 0x39, 0xde, + 0x02, 0x02, 0x8e, 0xd8, 0xa5, 0xbb, 0x0a, 0x2b, 0xda, 0xd0, 0x3a, 0x32, 0x7d, 0x01, 0xf3, 0x12, + 0x32, 0xd1, 0xe8, 0xdf, 0x83, 0x79, 0x26, 0xd0, 0xda, 0x35, 0x0c, 0x51, 0x1b, 0x4a, 0x87, 0xb6, + 0xa6, 0x3d, 0x85, 0xe6, 0xfe, 0x0e, 0x10, 0x93, 0x9b, 0x34, 0xc4, 0xa3, 0x82, 0x8e, 0x08, 0x75, + 0x2d, 0x9b, 0x4e, 0x5e, 0x10, 0xf8, 0x25, 0x06, 0xfa, 0xe7, 0x59, 0xc0, 0x83, 0x40, 0x72, 0xf5, + 0x9d, 0xba, 0xe6, 0xcf, 0x60, 0x51, 0x33, 0x7e, 0xc6, 0x68, 0x9f, 0x2b, 0xdc, 0xef, 0x27, 0x83, + 0x98, 0x21, 0x4f, 0xc7, 0x93, 0x5f, 0xdc, 0x03, 0x51, 0xbf, 0xc8, 0xd2, 0xf1, 0xc4, 0x07, 0x59, + 0x82, 0x5a, 0x18, 0xc8, 0x1c, 0xbb, 0x16, 0x06, 0xee, 0xff, 0x39, 0xb0, 0x62, 0x2c, 0xe4, 0x8d, + 0x9d, 0xb2, 0xe4, 0x71, 0xb5, 0x0a, 0x8f, 0x7b, 0x04, 0xb3, 0x67, 0x61, 0xc0, 0x53, 0x7b, 0xae, + 0xd7, 0x75, 0x45, 0xce, 0x5a, 0x87, 0x87, 0x28, 0x1c, 0xd5, 0xcf, 0xaf, 0xf2, 0xf6, 0xec, 0x44, + 0x54, 0x8e, 0x52, 0xda, 0x0f, 0x77, 0xca, 0xfb, 0xc1, 0xd6, 0xe5, 0xdc, 0xa8, 0x2e, 0x45, 0x26, + 0xa8, 0x69, 0x6b, 0xcf, 0xeb, 0x01, 0x14, 0xc0, 0x89, 0x66, 0xfd, 0x2d, 0x80, 0x44, 0x63, 0x4a, + 0xff, 0xdb, 0x2a, 0x09, 0xad, 0x5d, 0xd0, 0x40, 0x76, 0x7f, 0x82, 0xc7, 0xb8, 0xc9, 0x5c, 0x2a, + 0xff, 0xb1, 0x45, 0x53, 0xf8, 0x22, 0x29, 0xd1, 0xcc, 0x2d, 0x62, 0x1f, 0x22, 0xb1, 0xa3, 0x5e, + 0x8f, 0x9b, 0xde, 0xa8, 0xdf, 0x26, 0x9e, 0x8f, 0xaf, 0x60, 0x5e, 0xce, 0x90, 0x6e, 0x21, 0x10, + 0x6a, 0x61, 0x40, 0x3e, 0x06, 0x30, 0xce, 0x10, 0xb1, 0xae, 0x6d, 0x25, 0x83, 0x9c, 0xa4, 0xbc, + 0x01, 0xd9, 0x19, 0xe8, 0xee, 0x39, 0xac, 0x56, 0xa0, 0x70, 0x51, 0x74, 0xf5, 0x25, 0x45, 0x51, + 0xdf, 0x64, 0x0f, 0x1a, 0x2c, 0x61, 0x7e, 0xd4, 0x2d, 0x12, 0x00, 0xc7, 0x03, 0x04, 0xbd, 0xe2, + 0x10, 0x0c, 0x50, 0x49, 0x24, 0x3c, 0x97, 0x07, 0xa8, 0x24, 0x0a, 0x5c, 0x1f, 0x93, 0x1a, 0x6b, + 0xd1, 0x52, 0x85, 0x93, 0x4c, 0xf6, 0x2e, 0x2c, 0xf8, 0x62, 0x8a, 0x5a, 0x58, 0x6b, 0x64, 0x61, + 0x9e, 0x46, 0x70, 0x09, 0x9e, 0x40, 0xc7, 0x49, 0x7c, 0x1e, 0x5e, 0x28, 0xef, 0x78, 0x1b, 0x83, + 0x95, 0x82, 0x15, 0xf9, 0x44, 0xe0, 0x33, 0x1f, 0xb9, 0x35, 0x3d, 0xfc, 0xed, 0xfe, 0xa9, 0x03, + 0xcb, 0xa7, 0x49, 0xc6, 0xce, 0x93, 0x28, 0x4c, 0x64, 0xea, 0xcc, 0x53, 0x09, 0x95, 0x5a, 0xcb, + 0x1c, 0x4d, 0x7e, 0xf2, 0x08, 0xd9, 0x4b, 0xc2, 0x58, 0xf8, 0x6a, 0x4d, 0x2a, 0x28, 0x09, 0x63, + 0xee, 0xaa, 0x64, 0x1f, 0x1a, 0x01, 0xcd, 0x7b, 0x59, 0x98, 0xf2, 0x42, 0x49, 0x86, 0x05, 0x13, + 0xc4, 0x09, 0x9f, 0xf9, 0x91, 0x1f, 0xf7, 0xa8, 0x8c, 0xec, 0xea, 0xd3, 0x5d, 0xc7, 0x70, 0xa5, + 0x25, 0x29, 0x8a, 0x82, 0x35, 0x1b, 0x2c, 0x97, 0xf2, 0x9b, 0x50, 0x4f, 0x15, 0x50, 0xba, 0x5f, + 0x5b, 0x69, 0x68, 0x74, 0x39, 0x5e, 0x81, 0xea, 0xee, 0xf0, 0xbc, 0xba, 0xa0, 0xf7, 0x62, 0xd0, + 0xef, 0xfb, 0xd9, 0x50, 0x71, 0x8b, 0x61, 0xf6, 0x38, 0x09, 0x63, 0xae, 0x28, 0xbe, 0x28, 0x95, + 0x78, 0xf1, 0xdf, 0xa6, 0xe8, 0x35, 0x4b, 0x74, 0x53, 0x5b, 0x33, 0xb6, 0xb6, 0xee, 0x02, 0xa4, + 0x34, 0xeb, 0xd1, 0x98, 0xf9, 0x17, 0x6a, 0xc5, 0x06, 0xc4, 0xbd, 0x04, 0xf2, 0xfc, 0xfc, 0x3c, + 0x0a, 0x63, 0xca, 0xd9, 0x4a, 0x61, 0x26, 0x68, 0x7f, 0xbc, 0x0c, 0x36, 0xa7, 0x99, 0x12, 0xa7, + 0x9f, 0xc1, 0xca, 0xf3, 0xb8, 0x82, 0x91, 0x22, 0xe7, 0x4c, 0x22, 0x57, 0x2b, 0x91, 0xfb, 0x31, + 0x34, 0x0d, 0xc1, 0x73, 0xf2, 0x11, 0xd4, 0xa5, 0x8c, 0x3a, 0x09, 0xef, 0xe8, 0x68, 0x50, 0x5a, + 0xa1, 0x57, 0x20, 0xbb, 0x7f, 0xe5, 0x40, 0xa3, 0x90, 0x2c, 0x27, 0x4f, 0xe0, 0x0e, 0x57, 0xb7, + 0xa2, 0x72, 0x57, 0x53, 0x29, 0x70, 0x0e, 0xf0, 0x5f, 0x91, 0xbb, 0x0b, 0xe4, 0xce, 0x0b, 0x80, + 0x02, 0x58, 0x91, 0xb5, 0x1f, 0xda, 0xd5, 0xd7, 0x56, 0x99, 0xaa, 0x12, 0xcd, 0x48, 0xe8, 0xff, + 0x65, 0x96, 0x97, 0x52, 0x15, 0xce, 0x22, 0x7d, 0xf0, 0x7d, 0x68, 0x88, 0xbd, 0xc0, 0x23, 0x80, + 0x12, 0xb8, 0xa9, 0xcf, 0xa1, 0x24, 0x8c, 0x3d, 0xc0, 0xbd, 0x81, 0xe3, 0xe4, 0x03, 0x58, 0x44, + 0x61, 0xbb, 0x89, 0x50, 0x88, 0xdc, 0xd8, 0xf6, 0x84, 0x26, 0xa2, 0x48, 0x95, 0x91, 0x14, 0xd6, + 0xad, 0x29, 0xdd, 0x5c, 0x88, 0x20, 0x0f, 0xa9, 0x1f, 0x1a, 0x75, 0xce, 0x38, 0x29, 0x85, 0xb2, + 0x24, 0x41, 0x39, 0x26, 0x54, 0xb7, 0xda, 0x2b, 0x8f, 0x90, 0x43, 0x68, 0x4a, 0x8e, 0xa8, 0x19, + 0x79, 0xc4, 0xd9, 0x32, 0x36, 0xc4, 0x44, 0x44, 0x20, 0x7d, 0x58, 0x33, 0x27, 0x68, 0x09, 0xef, + 0xe0, 0xc4, 0x8f, 0xa7, 0x97, 0x30, 0x2e, 0x09, 0x48, 0x7a, 0xa5, 0x81, 0xce, 0x1f, 0x40, 0x7b, + 0xdc, 0x82, 0x2a, 0xcc, 0xfe, 0x8e, 0x6d, 0xf6, 0xb5, 0x0a, 0x97, 0xcc, 0xcd, 0x3e, 0xd3, 0x97, + 0xb0, 0x39, 0x46, 0x98, 0x37, 0xa8, 0xe8, 0x0d, 0x4f, 0x35, 0xbd, 0xe9, 0xcf, 0x1d, 0xe8, 0x1c, + 0x05, 0x41, 0x29, 0x38, 0x15, 0x05, 0xf8, 0x77, 0x1d, 0x72, 0x77, 0x61, 0xbb, 0x52, 0x20, 0xd9, + 0x29, 0x78, 0x0d, 0xbb, 0x1e, 0xed, 0x27, 0xd7, 0xf4, 0xbb, 0x16, 0xd9, 0xdd, 0x87, 0xbb, 0xe3, + 0x38, 0x4b, 0xd9, 0xb0, 0x75, 0x66, 0x77, 0x51, 0x75, 0x62, 0xf4, 0x5f, 0x0e, 0x2c, 0xda, 0xfd, + 0xd5, 0x6f, 0xab, 0x8e, 0x7e, 0x0f, 0x48, 0x46, 0x73, 0xd6, 0xcd, 0x92, 0x28, 0xe2, 0xe5, 0x74, + 0x40, 0x23, 0x7f, 0x28, 0x3b, 0xbb, 0xcb, 0x7c, 0xc4, 0x13, 0x03, 0x9f, 0x72, 0x38, 0xd9, 0x84, + 0x79, 0x3f, 0x0d, 0xbb, 0xdc, 0x6b, 0x44, 0x2d, 0x3d, 0xe7, 0xa7, 0xe1, 0x4f, 0xe8, 0x90, 0xb8, + 0xb0, 0x28, 0x07, 0xba, 0x11, 0xbd, 0xa6, 0x11, 0xe6, 0x7c, 0x33, 0x5e, 0x43, 0x0c, 0xff, 0x94, + 0x83, 0x78, 0xed, 0x9b, 0x66, 0x21, 0x77, 0xbf, 0xa2, 0x85, 0x3c, 0x8f, 0xd2, 0xb4, 0x24, 0x5c, + 0xad, 0xce, 0xfd, 0x05, 0x6c, 0x55, 0xe8, 0x42, 0xc6, 0xa8, 0x1f, 0x41, 0xcb, 0x6e, 0x44, 0xab, + 0x38, 0xa5, 0xb3, 0x56, 0x6b, 0xa2, 0xb7, 0x74, 0x6e, 0xd1, 0x91, 0xd9, 0x27, 0xe2, 0x78, 0x3e, + 0xd3, 0xfd, 0x22, 0xf7, 0x2b, 0x58, 0x2b, 0x80, 0xc7, 0x49, 0x7c, 0x4d, 0xb3, 0x9c, 0x7b, 0x1b, + 0x81, 0xd9, 0xf3, 0x2c, 0x51, 0xcd, 0x4e, 0xfc, 0xcd, 0xf3, 0x36, 0x96, 0x48, 0x37, 0xa8, 0xb1, + 0x84, 0xe3, 0x64, 0x3e, 0x53, 0xa7, 0x14, 0xfe, 0xe6, 0x79, 0x72, 0x88, 0x44, 0x68, 0x17, 0xc7, + 0x84, 0xab, 0x36, 0x24, 0x8c, 0x73, 0x71, 0x5f, 0x61, 0xfa, 0x68, 0x8a, 0x22, 0xd7, 0xf8, 0xdb, + 0xd0, 0x10, 0x6b, 0xe4, 0x33, 0xd5, 0xfa, 0x76, 0xac, 0xf5, 0x8d, 0x88, 0xe9, 0xc1, 0xb9, 0x86, + 0xba, 0xff, 0x53, 0x83, 0x26, 0x66, 0xac, 0x9f, 0x52, 0xe6, 0x87, 0xd1, 0xe4, 0x5c, 0x5a, 0xe4, + 0xa0, 0x35, 0x9d, 0x83, 0xbe, 0x05, 0x8b, 0x66, 0x33, 0x63, 0xa8, 0x8a, 0x59, 0xa3, 0x95, 0x31, + 0x24, 0xf7, 0x61, 0x09, 0x4b, 0xeb, 0x02, 0x4b, 0xf8, 0xcc, 0x22, 0x42, 0x35, 0x9a, 0x5d, 0x08, + 0xdc, 0x19, 0x29, 0x04, 0xf8, 0x30, 0x26, 0xd3, 0xdd, 0x3c, 0x0c, 0x74, 0x9d, 0x80, 0x90, 0x17, + 0x61, 0x60, 0x0c, 0xe3, 0xec, 0x79, 0x63, 0x18, 0x67, 0xf3, 0x1a, 0x28, 0xa3, 0xd8, 0xc1, 0xc6, + 0x16, 0x0f, 0x96, 0xc3, 0x33, 0x5e, 0x53, 0x01, 0x5f, 0x86, 0x7d, 0xbc, 0x34, 0x91, 0x8d, 0x63, + 0xd1, 0x67, 0x91, 0x5f, 0x45, 0x99, 0x06, 0x66, 0x99, 0x56, 0x14, 0x75, 0x0d, 0xab, 0xa8, 0xdb, + 0x83, 0x46, 0x92, 0xd2, 0xb8, 0x2b, 0x4b, 0xec, 0xa6, 0xc8, 0x1e, 0x38, 0xe8, 0x15, 0x42, 0x64, + 0xcb, 0x04, 0x75, 0x9e, 0x4f, 0x53, 0x97, 0xda, 0x8a, 0xa9, 0x8d, 0x2a, 0x46, 0x15, 0x82, 0x33, + 0xb7, 0x15, 0x82, 0xee, 0x11, 0x66, 0xc5, 0x8a, 0xb1, 0x74, 0x9f, 0xf7, 0x60, 0x0e, 0xd5, 0xa4, + 0x3c, 0x67, 0xcd, 0x2a, 0x63, 0xa4, 0x53, 0x78, 0x12, 0xc7, 0xfd, 0x31, 0x5e, 0x35, 0xe1, 0xd0, + 0x34, 0xa2, 0x6f, 0xc1, 0x82, 0xb0, 0x8a, 0xf6, 0x9a, 0x79, 0xfc, 0x7e, 0x16, 0xb8, 0xff, 0xe6, + 0x00, 0x79, 0x31, 0x38, 0xeb, 0x87, 0xd3, 0x53, 0x9b, 0xbe, 0x40, 0x27, 0x30, 0x8b, 0x6e, 0x22, + 0xdc, 0x11, 0x7f, 0x8f, 0x78, 0xc8, 0xec, 0xa8, 0x87, 0x14, 0xe6, 0xbc, 0x53, 0x5d, 0xa3, 0xcf, + 0x99, 0xc6, 0xe7, 0x21, 0x3e, 0x0a, 0x69, 0xcc, 0xba, 0xb2, 0xd9, 0xc2, 0x43, 0x3c, 0x02, 0x9e, + 0x05, 0xee, 0x0b, 0x58, 0xb5, 0x56, 0x26, 0x35, 0x7d, 0x0f, 0x9a, 0x42, 0x80, 0x34, 0xf2, 0x7b, + 0xba, 0xd3, 0xdc, 0x40, 0xd8, 0x29, 0x82, 0x26, 0xe9, 0xeb, 0xbf, 0x1d, 0x20, 0xc7, 0xfc, 0xe0, + 0x8a, 0xa6, 0xd6, 0x17, 0x77, 0x1c, 0x51, 0x25, 0x15, 0xf4, 0xea, 0x12, 0xf2, 0xcc, 0x66, 0x36, + 0x63, 0x31, 0xd3, 0x9a, 0x9e, 0x7d, 0xc3, 0x56, 0x48, 0x69, 0xd7, 0xde, 0x87, 0xa5, 0x1b, 0x3f, + 0x8a, 0x28, 0xd3, 0x97, 0x15, 0xb2, 0x67, 0x2a, 0xa0, 0xaa, 0xe2, 0x52, 0xf6, 0x9a, 0x2f, 0xec, + 0xc5, 0x4b, 0x22, 0x6b, 0xbd, 0xf2, 0xec, 0x7b, 0x02, 0x1b, 0x02, 0x7c, 0x14, 0x45, 0x53, 0xef, + 0x21, 0xf7, 0xaf, 0x6b, 0xb0, 0x59, 0x9a, 0xa6, 0x0f, 0x09, 0x7b, 0x07, 0x3c, 0xd0, 0xcb, 0xad, + 0x9e, 0x70, 0x20, 0x3f, 0xe5, 0xac, 0xce, 0x3f, 0x39, 0x30, 0x27, 0x40, 0x13, 0xad, 0xf1, 0xa5, + 0x32, 0xbf, 0x8c, 0x31, 0x22, 0xff, 0xfd, 0xfe, 0x74, 0xcc, 0xc4, 0x7f, 0xe6, 0x05, 0x95, 0xf0, + 0x1b, 0x79, 0x37, 0xf5, 0x23, 0x58, 0x1e, 0x45, 0x78, 0xa3, 0xe6, 0xbd, 0xa8, 0xa1, 0x9f, 0x5e, + 0x53, 0xe3, 0x42, 0xea, 0x6b, 0x07, 0x5a, 0xc7, 0x49, 0x1c, 0x84, 0x3c, 0x3e, 0x9e, 0xfa, 0x99, + 0xdf, 0xcf, 0xc9, 0x0e, 0xcf, 0x6c, 0x24, 0x48, 0x35, 0x59, 0x35, 0x60, 0x4c, 0x3b, 0x6b, 0x17, + 0xa0, 0x77, 0x49, 0x7b, 0x57, 0x5d, 0xd9, 0x5f, 0xe2, 0x4e, 0x5f, 0x47, 0xc8, 0x27, 0x61, 0x90, + 0x93, 0xf7, 0x61, 0xb5, 0x18, 0xee, 0xfa, 0x71, 0xd0, 0x95, 0xcd, 0x25, 0xec, 0x37, 0x6b, 0xbc, + 0xa3, 0x38, 0x38, 0xca, 0xaf, 0xb0, 0x2b, 0xae, 0x7b, 0x2a, 0x5d, 0x6b, 0xc3, 0xb6, 0x34, 0xfc, + 0x08, 0xc1, 0xee, 0xff, 0x3a, 0x18, 0xef, 0xd4, 0xaa, 0xa4, 0xb5, 0x8b, 0x36, 0x0a, 0x76, 0xd7, + 0x2c, 0x93, 0xd5, 0x46, 0x4c, 0x46, 0x60, 0x36, 0x64, 0xb4, 0xaf, 0xc2, 0x08, 0xff, 0x4d, 0x3e, + 0x81, 0x65, 0xbd, 0xe2, 0x6e, 0x8a, 0x6a, 0x91, 0xdb, 0x64, 0xb3, 0x28, 0x13, 0x2c, 0xad, 0x79, + 0xad, 0xde, 0x88, 0x1a, 0xd5, 0xf6, 0xba, 0x73, 0xeb, 0xf6, 0xe2, 0x51, 0xa9, 0x87, 0xda, 0x9e, + 0x93, 0x49, 0x14, 0x7e, 0x09, 0xa9, 0x69, 0x6f, 0xc0, 0x68, 0x20, 0x13, 0x23, 0xfd, 0xed, 0xfe, + 0xa7, 0x03, 0xad, 0xa3, 0x20, 0xc0, 0x75, 0x4f, 0x13, 0x26, 0xd4, 0x2a, 0x6b, 0xb7, 0xac, 0x72, + 0xe6, 0xd7, 0x5c, 0xe5, 0x37, 0x0e, 0x22, 0x63, 0x94, 0xe0, 0xba, 0xb0, 0x5c, 0xac, 0xb3, 0xda, + 0xbc, 0xee, 0x6f, 0x00, 0x11, 0xc9, 0xb4, 0xa5, 0x8e, 0x51, 0xac, 0x75, 0x58, 0xb5, 0xb0, 0x64, + 0xac, 0xf9, 0x0c, 0x1e, 0x9e, 0x50, 0x76, 0x9c, 0x0d, 0x53, 0x96, 0xa8, 0xe4, 0xe5, 0x53, 0x9a, + 0x26, 0x79, 0xa8, 0x22, 0x17, 0x9d, 0x2a, 0xfa, 0xfc, 0xb3, 0x03, 0x8f, 0xa6, 0x20, 0x24, 0x97, + 0xf0, 0x87, 0xe5, 0x6e, 0xc2, 0xef, 0x1a, 0x85, 0xe4, 0x74, 0x54, 0x0e, 0x34, 0x44, 0xde, 0xd7, + 0x6a, 0x92, 0x9d, 0x1f, 0xc2, 0x92, 0x3d, 0xf8, 0x46, 0xa1, 0x22, 0x82, 0x07, 0xb7, 0x08, 0x31, + 0x8d, 0xcf, 0x3d, 0x80, 0xa5, 0x9e, 0x45, 0x42, 0x32, 0x1a, 0x81, 0xba, 0xc7, 0xf0, 0xf6, 0xad, + 0xdc, 0xa4, 0xda, 0xc6, 0xd6, 0x63, 0xee, 0xdf, 0xcd, 0xc2, 0xe6, 0x17, 0x21, 0xbb, 0x0c, 0x32, + 0xff, 0x46, 0x79, 0xdf, 0x34, 0x42, 0x8e, 0x94, 0x6a, 0xb5, 0x72, 0x75, 0xf9, 0x0e, 0xac, 0x24, + 0x31, 0xc5, 0x8c, 0xb2, 0x9b, 0xfa, 0x79, 0x7e, 0x93, 0x64, 0xea, 0x2c, 0x6d, 0x25, 0x31, 0xe5, + 0x59, 0xe5, 0xa9, 0x04, 0x8f, 0x9c, 0xc6, 0xb3, 0xa3, 0xa7, 0xf1, 0x32, 0xcc, 0xa4, 0x61, 0x2c, + 0x3b, 0xe4, 0xfc, 0x27, 0x3f, 0x3b, 0x59, 0xe6, 0x07, 0x06, 0x65, 0x79, 0x76, 0x22, 0x54, 0xd3, + 0x35, 0x7b, 0xb6, 0xf3, 0x23, 0x3d, 0x5b, 0x43, 0x27, 0x0b, 0x76, 0x8d, 0xba, 0x07, 0x0d, 0xf9, + 0xb3, 0xcb, 0xfc, 0x0b, 0x99, 0xf0, 0x82, 0x04, 0xbd, 0xf4, 0x2f, 0x8c, 0x7c, 0x08, 0xac, 0x7c, + 0x68, 0x17, 0xe0, 0x9c, 0xd2, 0xae, 0x95, 0xfa, 0xd6, 0xcf, 0x29, 0x15, 0x41, 0x97, 0x27, 0x46, + 0x67, 0x7e, 0x7c, 0xd5, 0xc5, 0x8a, 0xb3, 0x29, 0xc4, 0xe1, 0x80, 0xcf, 0x79, 0xd5, 0x79, 0x0f, + 0x9a, 0x38, 0xa8, 0x64, 0x5a, 0x14, 0x1a, 0xe5, 0xb0, 0xa3, 0xa2, 0x76, 0x46, 0x94, 0x5e, 0xc8, + 0x86, 0xed, 0xa5, 0x62, 0xfe, 0x71, 0xc8, 0x86, 0x7a, 0x3e, 0xea, 0x2c, 0x1b, 0xb6, 0x5b, 0xc5, + 0xfc, 0x63, 0x01, 0xe2, 0xe2, 0xe5, 0x37, 0xe1, 0x39, 0x15, 0x57, 0xec, 0xcb, 0xf2, 0xd1, 0x09, + 0x87, 0x1c, 0x27, 0x01, 0xd6, 0x01, 0x37, 0x61, 0x66, 0x94, 0x22, 0x2b, 0xa2, 0x60, 0xe1, 0x40, + 0xe5, 0x1a, 0xee, 0x3b, 0xb0, 0xac, 0xdc, 0xc5, 0x7c, 0x50, 0x95, 0xd1, 0x7c, 0x10, 0x31, 0xf5, + 0xa0, 0x4a, 0x7c, 0x3d, 0xfe, 0xf7, 0xbb, 0xb0, 0x74, 0x92, 0x08, 0x07, 0x7d, 0xc9, 0xed, 0x92, + 0x91, 0xe7, 0x30, 0x2f, 0x5f, 0x09, 0x91, 0x8d, 0xd2, 0xb3, 0x21, 0xf4, 0xba, 0xce, 0xe6, 0x98, + 0xe7, 0x44, 0xee, 0xea, 0xaf, 0xfe, 0xf5, 0x3f, 0xfe, 0xa2, 0xb6, 0x48, 0x1a, 0x87, 0xd7, 0x1f, + 0x1c, 0x5e, 0x50, 0x16, 0x72, 0x2a, 0x97, 0xb0, 0x68, 0xbd, 0x86, 0x21, 0x3b, 0xd6, 0x8b, 0x96, + 0x91, 0x47, 0x32, 0x9d, 0xdd, 0x89, 0xef, 0x5d, 0xdc, 0x0e, 0xb2, 0x58, 0x23, 0x44, 0xb2, 0xc8, + 0x11, 0x45, 0x10, 0xfe, 0x0a, 0x5a, 0x4f, 0xb1, 0x0f, 0xa0, 0xa9, 0x92, 0xbd, 0x82, 0x5a, 0xe5, + 0x2b, 0x9f, 0xce, 0xfe, 0x78, 0x04, 0xc9, 0x71, 0x1b, 0x39, 0xae, 0x93, 0x55, 0xce, 0x51, 0xf4, + 0x19, 0xf4, 0xeb, 0x1a, 0x92, 0xc3, 0xb2, 0x7c, 0x37, 0xf0, 0xad, 0xf2, 0xdc, 0x41, 0x9e, 0x1b, + 0x64, 0x8d, 0xf3, 0x0c, 0x04, 0x83, 0x82, 0x69, 0x82, 0x65, 0x8c, 0xf9, 0xce, 0x85, 0xdc, 0x1d, + 0xfb, 0x00, 0x46, 0xb0, 0xdc, 0xbb, 0xe5, 0x81, 0x8c, 0xbd, 0xca, 0x0b, 0xca, 0x71, 0xf5, 0x1b, + 0x19, 0xd2, 0x83, 0xa6, 0xf9, 0x8c, 0x84, 0x6c, 0x57, 0xbc, 0xd1, 0xd0, 0xac, 0x76, 0xaa, 0x07, + 0x25, 0x9f, 0x36, 0xf2, 0x21, 0x64, 0x59, 0xf2, 0xd1, 0xaf, 0x4e, 0xc8, 0x2f, 0xa1, 0x35, 0xf2, + 0x04, 0x83, 0xb8, 0x23, 0x8a, 0xaa, 0x78, 0x4e, 0xd3, 0x79, 0x6b, 0x22, 0x8e, 0xe4, 0x7a, 0x17, + 0xb9, 0xb6, 0xdd, 0x55, 0x43, 0x9f, 0x8a, 0xf3, 0x0f, 0x9c, 0x77, 0x48, 0x8e, 0x1a, 0x35, 0xdf, + 0x71, 0x4c, 0xc5, 0x7b, 0xaf, 0x62, 0xa9, 0xd6, 0x86, 0x18, 0xd5, 0xaa, 0xe2, 0x89, 0x1b, 0x23, + 0xc7, 0x5b, 0x62, 0xe3, 0x8d, 0x0b, 0xee, 0xf1, 0x69, 0xf8, 0xee, 0x56, 0xbf, 0x91, 0x91, 0xcf, + 0x74, 0x4a, 0x7b, 0x44, 0x71, 0x4d, 0x58, 0x4a, 0x72, 0xeb, 0x09, 0x91, 0x64, 0x6a, 0xfb, 0x4f, + 0xc5, 0x23, 0x9e, 0xca, 0x95, 0x9a, 0xaf, 0x72, 0xc6, 0xae, 0x34, 0x61, 0x69, 0x4e, 0x5e, 0xc3, + 0x92, 0xd8, 0x98, 0xdf, 0xbe, 0x65, 0x77, 0x91, 0xef, 0xa6, 0x4b, 0x8a, 0xdd, 0x69, 0x1a, 0xf6, + 0x0b, 0xa8, 0xeb, 0x9b, 0x78, 0xd2, 0x36, 0x16, 0x61, 0xbd, 0xf9, 0xe8, 0x8c, 0xb9, 0xd1, 0x57, + 0xde, 0xea, 0x2e, 0xca, 0x55, 0x89, 0xfb, 0x79, 0x4e, 0xf8, 0x17, 0x00, 0xc5, 0x15, 0x3f, 0xd9, + 0x2a, 0x51, 0xd6, 0x9a, 0xeb, 0x54, 0x0d, 0xa9, 0x87, 0x82, 0x48, 0x7e, 0x99, 0x2c, 0x59, 0xe4, + 0xd5, 0x7e, 0xd3, 0x37, 0xb1, 0xd6, 0x7e, 0x1b, 0x7d, 0x14, 0xd0, 0x19, 0x7f, 0x1b, 0xac, 0x8c, + 0xe2, 0xaa, 0xcd, 0xa6, 0x6b, 0x0c, 0xbe, 0x82, 0x0b, 0x8c, 0xcb, 0xc6, 0x35, 0xf4, 0x4e, 0x15, + 0x97, 0xca, 0xb8, 0x5c, 0xbe, 0x53, 0x76, 0xb7, 0x90, 0xd5, 0x2a, 0x59, 0x19, 0x65, 0x95, 0x93, + 0x2b, 0x7c, 0xf3, 0x6b, 0xdc, 0xa2, 0x12, 0x93, 0x56, 0xf9, 0x4a, 0xb9, 0x73, 0x77, 0xdc, 0xf0, + 0x98, 0x33, 0x40, 0xa6, 0x21, 0xb8, 0xa9, 0x84, 0xc1, 0xc5, 0xdd, 0xa9, 0x65, 0x70, 0xeb, 0x8a, + 0xb5, 0xb3, 0x55, 0x31, 0x22, 0xa9, 0xaf, 0x23, 0xf5, 0x16, 0x51, 0x36, 0xef, 0x09, 0x5a, 0xc2, + 0x26, 0xba, 0xa9, 0x6d, 0xd9, 0x64, 0xf4, 0xe6, 0xd3, 0x8a, 0x81, 0xa5, 0xfb, 0xcf, 0x52, 0x0c, + 0xd4, 0x37, 0x9c, 0xe4, 0x4f, 0xec, 0x8b, 0x54, 0x75, 0xb1, 0xe3, 0x4e, 0xbc, 0x89, 0x29, 0xed, + 0x96, 0xb1, 0xb7, 0x35, 0xee, 0x1e, 0x72, 0xde, 0x22, 0x9b, 0xa3, 0x9c, 0xe5, 0xcd, 0x0f, 0xf9, + 0x95, 0x03, 0xab, 0x15, 0xf7, 0x0a, 0x85, 0x04, 0xe3, 0x6f, 0x41, 0x0a, 0x09, 0x26, 0x5d, 0x4c, + 0xb8, 0x28, 0xc1, 0x8e, 0x8b, 0x12, 0xf8, 0x41, 0xa0, 0x25, 0x90, 0x59, 0x15, 0xf7, 0xcc, 0x3f, + 0x73, 0x60, 0xa3, 0xfa, 0x0e, 0x81, 0xdc, 0xd7, 0x4f, 0x2f, 0x27, 0xdd, 0x6e, 0x74, 0x1e, 0xdc, + 0x86, 0x26, 0xa5, 0xb9, 0x8f, 0xd2, 0xec, 0xb9, 0x1d, 0x2e, 0x4d, 0x86, 0xb8, 0x55, 0x02, 0xdd, + 0x60, 0x29, 0x6e, 0x77, 0xe9, 0x89, 0x71, 0x8a, 0x57, 0x5f, 0x66, 0x74, 0xee, 0x4d, 0xc0, 0xb0, + 0xc3, 0x17, 0x59, 0x97, 0x06, 0xc1, 0xd6, 0xb6, 0x6e, 0xf7, 0xcb, 0x3d, 0x5a, 0x74, 0xc1, 0xad, + 0x3d, 0x5a, 0x6a, 0xec, 0x5b, 0x7b, 0xb4, 0xdc, 0x6b, 0x2f, 0xed, 0x51, 0x64, 0x86, 0x7d, 0x77, + 0xf2, 0x25, 0x6e, 0x1b, 0xd9, 0x07, 0x6a, 0x8f, 0x6e, 0xf5, 0xbc, 0x6a, 0xdb, 0xd8, 0x9d, 0x9e, + 0x52, 0xa8, 0x14, 0xed, 0x25, 0xae, 0x3d, 0x0f, 0x16, 0x14, 0x3a, 0xd9, 0x1c, 0x25, 0xa0, 0x28, + 0x57, 0x36, 0x6e, 0xdd, 0x4d, 0x24, 0xba, 0xe2, 0x36, 0x4d, 0xa2, 0x9c, 0xe6, 0x19, 0x34, 0x8c, + 0x26, 0x25, 0xd1, 0x41, 0xb6, 0xdc, 0x93, 0xed, 0x6c, 0x57, 0x8e, 0xd9, 0xa1, 0xc4, 0x6d, 0x71, + 0x06, 0x39, 0x22, 0x98, 0x3c, 0x8c, 0x16, 0x5e, 0xc1, 0xa3, 0xdc, 0xc7, 0x2c, 0x78, 0x54, 0xf5, + 0xfc, 0x2c, 0x1e, 0x3d, 0x44, 0xd0, 0x3c, 0x32, 0x68, 0x8d, 0xb4, 0xce, 0x8a, 0xa3, 0xb8, 0xba, + 0x51, 0x58, 0x1c, 0xc5, 0x63, 0x7a, 0x6e, 0x76, 0xb2, 0x23, 0xf8, 0xf9, 0x51, 0x54, 0xd8, 0x43, + 0x84, 0x48, 0xd1, 0x58, 0xb2, 0x6c, 0x6d, 0x75, 0xd0, 0x2c, 0x5b, 0xdb, 0x5d, 0xa8, 0x52, 0x88, + 0xa4, 0x82, 0xd6, 0x2b, 0x58, 0x50, 0x1d, 0x8d, 0xc2, 0xd0, 0x23, 0xbd, 0x9c, 0x4e, 0xbb, 0x3c, + 0x20, 0xa9, 0x5a, 0xc6, 0xf6, 0x83, 0x00, 0xa9, 0x4a, 0x43, 0x18, 0xfd, 0x8d, 0xc2, 0x10, 0xe5, + 0xd6, 0x48, 0x61, 0x88, 0xaa, 0x86, 0x88, 0x65, 0x08, 0xb1, 0xdb, 0x35, 0x8f, 0xbf, 0x77, 0xe0, + 0xde, 0xad, 0xed, 0x09, 0xf2, 0xbd, 0x37, 0xe8, 0x64, 0x08, 0x81, 0x3e, 0x78, 0xe3, 0xde, 0x87, + 0xfb, 0x10, 0xc5, 0x74, 0xdd, 0x5d, 0x75, 0x00, 0xe1, 0xb4, 0x40, 0xa0, 0xeb, 0x46, 0x08, 0x17, + 0xfa, 0x6f, 0x1d, 0xf1, 0x57, 0x10, 0x13, 0xe8, 0x92, 0x83, 0x29, 0x05, 0x50, 0x02, 0x1f, 0x4e, + 0x8d, 0x2f, 0xc5, 0x7d, 0x80, 0xe2, 0xee, 0xbb, 0xdb, 0x13, 0xc4, 0xe5, 0xc2, 0xfe, 0x31, 0x6c, + 0xeb, 0x36, 0x86, 0x45, 0xf7, 0xb3, 0x41, 0x1c, 0xe4, 0x45, 0xd5, 0x34, 0xa6, 0xd7, 0x51, 0x38, + 0xce, 0x68, 0x75, 0x6b, 0x9f, 0x29, 0x37, 0x72, 0x54, 0x88, 0x71, 0xce, 0x69, 0x73, 0xee, 0x29, + 0xac, 0xa8, 0x79, 0x9f, 0x85, 0x3e, 0xfb, 0xc6, 0x3c, 0xf7, 0x91, 0x67, 0xc7, 0x5d, 0x37, 0x79, + 0x9e, 0x87, 0x3e, 0x53, 0x1c, 0xcf, 0xe6, 0xf0, 0x2f, 0x9e, 0x3e, 0xfc, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xe9, 0x97, 0xa2, 0x2a, 0x24, 0x35, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4124,6 +4496,10 @@ const _ = grpc.SupportPackageIsVersion4 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type GoCryptoTraderClient interface { GetInfo(ctx context.Context, in *GetInfoRequest, opts ...grpc.CallOption) (*GetInfoResponse, error) + GetSubsystems(ctx context.Context, in *GetSubsystemsRequest, opts ...grpc.CallOption) (*GetSusbsytemsResponse, error) + EnableSubsystem(ctx context.Context, in *GenericSubsystemRequest, opts ...grpc.CallOption) (*GenericSubsystemResponse, error) + DisableSubsystem(ctx context.Context, in *GenericSubsystemRequest, opts ...grpc.CallOption) (*GenericSubsystemResponse, error) + GetRPCEndpoints(ctx context.Context, in *GetRPCEndpointsRequest, opts ...grpc.CallOption) (*GetRPCEndpointsResponse, error) GetExchanges(ctx context.Context, in *GetExchangesRequest, opts ...grpc.CallOption) (*GetExchangesResponse, error) DisableExchange(ctx context.Context, in *GenericExchangeNameRequest, opts ...grpc.CallOption) (*GenericExchangeNameResponse, error) GetExchangeInfo(ctx context.Context, in *GenericExchangeNameRequest, opts ...grpc.CallOption) (*GetExchangeInfoResponse, error) @@ -4173,6 +4549,42 @@ func (c *goCryptoTraderClient) GetInfo(ctx context.Context, in *GetInfoRequest, return out, nil } +func (c *goCryptoTraderClient) GetSubsystems(ctx context.Context, in *GetSubsystemsRequest, opts ...grpc.CallOption) (*GetSusbsytemsResponse, error) { + out := new(GetSusbsytemsResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/GetSubsystems", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *goCryptoTraderClient) EnableSubsystem(ctx context.Context, in *GenericSubsystemRequest, opts ...grpc.CallOption) (*GenericSubsystemResponse, error) { + out := new(GenericSubsystemResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/EnableSubsystem", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *goCryptoTraderClient) DisableSubsystem(ctx context.Context, in *GenericSubsystemRequest, opts ...grpc.CallOption) (*GenericSubsystemResponse, error) { + out := new(GenericSubsystemResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/DisableSubsystem", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *goCryptoTraderClient) GetRPCEndpoints(ctx context.Context, in *GetRPCEndpointsRequest, opts ...grpc.CallOption) (*GetRPCEndpointsResponse, error) { + out := new(GetRPCEndpointsResponse) + err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/GetRPCEndpoints", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *goCryptoTraderClient) GetExchanges(ctx context.Context, in *GetExchangesRequest, opts ...grpc.CallOption) (*GetExchangesResponse, error) { out := new(GetExchangesResponse) err := c.cc.Invoke(ctx, "/gctrpc.GoCryptoTrader/GetExchanges", in, out, opts...) @@ -4446,6 +4858,10 @@ func (c *goCryptoTraderClient) WithdrawFiatFunds(ctx context.Context, in *Withdr // GoCryptoTraderServer is the server API for GoCryptoTrader service. type GoCryptoTraderServer interface { GetInfo(context.Context, *GetInfoRequest) (*GetInfoResponse, error) + GetSubsystems(context.Context, *GetSubsystemsRequest) (*GetSusbsytemsResponse, error) + EnableSubsystem(context.Context, *GenericSubsystemRequest) (*GenericSubsystemResponse, error) + DisableSubsystem(context.Context, *GenericSubsystemRequest) (*GenericSubsystemResponse, error) + GetRPCEndpoints(context.Context, *GetRPCEndpointsRequest) (*GetRPCEndpointsResponse, error) GetExchanges(context.Context, *GetExchangesRequest) (*GetExchangesResponse, error) DisableExchange(context.Context, *GenericExchangeNameRequest) (*GenericExchangeNameResponse, error) GetExchangeInfo(context.Context, *GenericExchangeNameRequest) (*GetExchangeInfoResponse, error) @@ -4500,6 +4916,78 @@ func _GoCryptoTrader_GetInfo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _GoCryptoTrader_GetSubsystems_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetSubsystemsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).GetSubsystems(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/GetSubsystems", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).GetSubsystems(ctx, req.(*GetSubsystemsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GoCryptoTrader_EnableSubsystem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenericSubsystemRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).EnableSubsystem(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/EnableSubsystem", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).EnableSubsystem(ctx, req.(*GenericSubsystemRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GoCryptoTrader_DisableSubsystem_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GenericSubsystemRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).DisableSubsystem(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/DisableSubsystem", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).DisableSubsystem(ctx, req.(*GenericSubsystemRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _GoCryptoTrader_GetRPCEndpoints_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRPCEndpointsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(GoCryptoTraderServer).GetRPCEndpoints(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/gctrpc.GoCryptoTrader/GetRPCEndpoints", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(GoCryptoTraderServer).GetRPCEndpoints(ctx, req.(*GetRPCEndpointsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _GoCryptoTrader_GetExchanges_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetExchangesRequest) if err := dec(in); err != nil { @@ -5048,6 +5536,22 @@ var _GoCryptoTrader_serviceDesc = grpc.ServiceDesc{ MethodName: "GetInfo", Handler: _GoCryptoTrader_GetInfo_Handler, }, + { + MethodName: "GetSubsystems", + Handler: _GoCryptoTrader_GetSubsystems_Handler, + }, + { + MethodName: "EnableSubsystem", + Handler: _GoCryptoTrader_EnableSubsystem_Handler, + }, + { + MethodName: "DisableSubsystem", + Handler: _GoCryptoTrader_DisableSubsystem_Handler, + }, + { + MethodName: "GetRPCEndpoints", + Handler: _GoCryptoTrader_GetRPCEndpoints_Handler, + }, { MethodName: "GetExchanges", Handler: _GoCryptoTrader_GetExchanges_Handler, diff --git a/gctrpc/rpc.pb.gw.go b/gctrpc/rpc.pb.gw.go index 7844c2e3..18bf8616 100644 --- a/gctrpc/rpc.pb.gw.go +++ b/gctrpc/rpc.pb.gw.go @@ -37,6 +37,58 @@ func request_GoCryptoTrader_GetInfo_0(ctx context.Context, marshaler runtime.Mar } +func request_GoCryptoTrader_GetSubsystems_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetSubsystemsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetSubsystems(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +var ( + filter_GoCryptoTrader_EnableSubsystem_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_GoCryptoTrader_EnableSubsystem_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenericSubsystemRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_GoCryptoTrader_EnableSubsystem_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.EnableSubsystem(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +var ( + filter_GoCryptoTrader_DisableSubsystem_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_GoCryptoTrader_DisableSubsystem_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GenericSubsystemRequest + var metadata runtime.ServerMetadata + + if err := runtime.PopulateQueryParameters(&protoReq, req.URL.Query(), filter_GoCryptoTrader_DisableSubsystem_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.DisableSubsystem(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func request_GoCryptoTrader_GetRPCEndpoints_0(ctx context.Context, marshaler runtime.Marshaler, client GoCryptoTraderClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq GetRPCEndpointsRequest + var metadata runtime.ServerMetadata + + msg, err := client.GetRPCEndpoints(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + var ( filter_GoCryptoTrader_GetExchanges_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -533,6 +585,86 @@ func RegisterGoCryptoTraderHandlerClient(ctx context.Context, mux *runtime.Serve }) + mux.Handle("GET", pattern_GoCryptoTrader_GetSubsystems_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_GetSubsystems_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_GetSubsystems_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_GoCryptoTrader_EnableSubsystem_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_EnableSubsystem_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_EnableSubsystem_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_GoCryptoTrader_DisableSubsystem_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_DisableSubsystem_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_DisableSubsystem_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + + mux.Handle("GET", pattern_GoCryptoTrader_GetRPCEndpoints_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_GoCryptoTrader_GetRPCEndpoints_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_GoCryptoTrader_GetRPCEndpoints_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_GoCryptoTrader_GetExchanges_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1139,6 +1271,14 @@ func RegisterGoCryptoTraderHandlerClient(ctx context.Context, mux *runtime.Serve var ( pattern_GoCryptoTrader_GetInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getinfo"}, "")) + pattern_GoCryptoTrader_GetSubsystems_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getsusbsystems"}, "")) + + pattern_GoCryptoTrader_EnableSubsystem_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "enablesubsystem"}, "")) + + pattern_GoCryptoTrader_DisableSubsystem_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "disablesubsystem"}, "")) + + pattern_GoCryptoTrader_GetRPCEndpoints_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getrpcendpoints"}, "")) + pattern_GoCryptoTrader_GetExchanges_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "getexchanges"}, "")) pattern_GoCryptoTrader_DisableExchange_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "disableexchange"}, "")) @@ -1203,6 +1343,14 @@ var ( var ( forward_GoCryptoTrader_GetInfo_0 = runtime.ForwardResponseMessage + forward_GoCryptoTrader_GetSubsystems_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_EnableSubsystem_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_DisableSubsystem_0 = runtime.ForwardResponseMessage + + forward_GoCryptoTrader_GetRPCEndpoints_0 = runtime.ForwardResponseMessage + forward_GoCryptoTrader_GetExchanges_0 = runtime.ForwardResponseMessage forward_GoCryptoTrader_DisableExchange_0 = runtime.ForwardResponseMessage diff --git a/gctrpc/rpc.proto b/gctrpc/rpc.proto index 28552d80..58a3271d 100644 --- a/gctrpc/rpc.proto +++ b/gctrpc/rpc.proto @@ -12,6 +12,35 @@ message GetInfoResponse { int64 enabled_exchanges = 3; string default_forex_provider = 4; string default_fiat_currency = 5; + map subsystem_status = 6; + map rpc_endpoints = 7; +} + +// TO-DO comms APIs +message GetCommunicationRelayersRequest {} +message GetCommunicationRelayersResponse {} + +message GenericSubsystemRequest { + string subsystem = 1; +} + +message GenericSubsystemResponse {} + +message GetSubsystemsRequest {} + +message GetSusbsytemsResponse { + map subsystems_status = 1; +} + +message GetRPCEndpointsRequest{} + +message RPCEndpoint { + bool started = 1; + string listen_address = 2; +} + +message GetRPCEndpointsResponse { + map endpoints = 1; } message GenericExchangeNameRequest { @@ -403,6 +432,30 @@ service GoCryptoTrader { }; } + rpc GetSubsystems (GetSubsystemsRequest) returns (GetSusbsytemsResponse) { + option (google.api.http) = { + get: "/v1/getsusbsystems" + }; + } + + rpc EnableSubsystem (GenericSubsystemRequest) returns (GenericSubsystemResponse) { + option (google.api.http) = { + get: "/v1/enablesubsystem" + }; + } + + rpc DisableSubsystem (GenericSubsystemRequest) returns (GenericSubsystemResponse) { + option (google.api.http) = { + get: "/v1/disablesubsystem" + }; + } + + rpc GetRPCEndpoints (GetRPCEndpointsRequest) returns (GetRPCEndpointsResponse) { + option (google.api.http) = { + get: "/v1/getrpcendpoints" + }; + } + rpc GetExchanges (GetExchangesRequest) returns (GetExchangesResponse) { option (google.api.http) = { get: "/v1/getexchanges" diff --git a/gctrpc/rpc.swagger.json b/gctrpc/rpc.swagger.json index b4fa444f..7a6cedd9 100644 --- a/gctrpc/rpc.swagger.json +++ b/gctrpc/rpc.swagger.json @@ -145,6 +145,30 @@ ] } }, + "/v1/disablesubsystem": { + "get": { + "operationId": "DisableSubsystem", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGenericSubsystemResponse" + } + } + }, + "parameters": [ + { + "name": "subsystem", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/enableexchange": { "post": { "operationId": "EnableExchange", @@ -171,6 +195,30 @@ ] } }, + "/v1/enablesubsystem": { + "get": { + "operationId": "EnableSubsystem", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGenericSubsystemResponse" + } + } + }, + "parameters": [ + { + "name": "subsystem", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/getaccountinfo": { "get": { "operationId": "GetAccountInfo", @@ -542,6 +590,38 @@ ] } }, + "/v1/getrpcendpoints": { + "get": { + "operationId": "GetRPCEndpoints", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGetRPCEndpointsResponse" + } + } + }, + "tags": [ + "GoCryptoTrader" + ] + } + }, + "/v1/getsusbsystems": { + "get": { + "operationId": "GetSubsystems", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/gctrpcGetSusbsytemsResponse" + } + } + }, + "tags": [ + "GoCryptoTrader" + ] + } + }, "/v1/getticker": { "post": { "operationId": "GetTicker", @@ -978,6 +1058,9 @@ "gctrpcGenericExchangeNameResponse": { "type": "object" }, + "gctrpcGenericSubsystemResponse": { + "type": "object" + }, "gctrpcGetAccountInfoResponse": { "type": "object", "properties": { @@ -1180,6 +1263,19 @@ }, "default_fiat_currency": { "type": "string" + }, + "subsystem_status": { + "type": "object", + "additionalProperties": { + "type": "boolean", + "format": "boolean" + } + }, + "rpc_endpoints": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/gctrpcRPCEndpoint" + } } } }, @@ -1290,6 +1386,29 @@ } } }, + "gctrpcGetRPCEndpointsResponse": { + "type": "object", + "properties": { + "endpoints": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/gctrpcRPCEndpoint" + } + } + } + }, + "gctrpcGetSusbsytemsResponse": { + "type": "object", + "properties": { + "subsystems_status": { + "type": "object", + "additionalProperties": { + "type": "boolean", + "format": "boolean" + } + } + } + }, "gctrpcGetTickerRequest": { "type": "object", "properties": { @@ -1490,6 +1609,18 @@ } } }, + "gctrpcRPCEndpoint": { + "type": "object", + "properties": { + "started": { + "type": "boolean", + "format": "boolean" + }, + "listen_address": { + "type": "string" + } + } + }, "gctrpcRemoveEventRequest": { "type": "object", "properties": {